需求:在做OAF開發時,經常會需要查詢功能,由於需求的不同,往往不能使用OAF標準的查詢功能,需要自己客戶化實現查詢功能,而在查詢功能中,經常會遇到查詢的時間範圍,要查詢從。。。開始,到。。。結束這段時間內的結果,所以會經常在AM的實作類別裡面給vo增加where語句限制,往往是擷取某個查詢條件,然後該查詢條件大於等於開始時間,小於等於結束時間,例如:
if (searchSubmitDateFrom != null && !("".equals(searchSubmitDateFrom))) {<br /> whereClause.append(" AND submit_date >= :");<br /> whereClause.append(++bindCount);<br /> params.addElement(searchSubmitDateFrom);<br />}</p><p>if (searchSubmitDateTo != null && !("".equals(searchSubmitDateTo))) {<br /> whereClause.append(" AND submit_date <= :");<br /> whereClause.append(++bindCount);<br /> params.addElement(searchSubmitDateTo);<br />}<br />
這中寫法,問題來了,當運行時,如果提交日期等於結束日期的記錄往往是查詢不到的,因為日期的時分秒引起的。所以這種情況要使用trunc函數對時間進行處理,把時間的時分秒給去除掉,例如:
if (searchSubmitDateTo != null && !("".equals(searchSubmitDateTo))) {<br /> whereClause.append(" AND trunc(submit_date) <= trunc(:");<br /> whereClause.append(++bindCount + ")");<br /> params.addElement(searchSubmitDateTo);<br />}</p><p>if (searchReqPickDateFrom != null && !("".equals(searchReqPickDateFrom))) {<br /> whereClause.append(" AND trunc(require_pick_date) >= trunc(:");<br /> whereClause.append(++bindCount + ")");<br /> params.addElement(searchReqPickDateFrom);<br />}
再次運行,不會出現類似問題。
trunc函數用法:
1.TRUNC(for dates)
描述:TRUNC函數為指定元素而截去的日期值。
文法:TRUNC(date[,fmt]),其中date 一個日期值,fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去。
使用方式:
TRUNC(TO_DATE('24-Nov-1999 08:00 pm'),'dd-mon-yyyy hh:mi am') = '24-Nov-1999 12:00:00 am'<br />TRUNC(TO_DATE('24-Nov-1999 08:37 pm','dd-mon-yyyy hh:mi am'),'hh') ='24-Nov-1999 08:00:00 am'<br />trunc(sysdate,'yyyy') --返回當年第一天.<br />trunc(sysdate,'mm') --返回當月第一天.<br />trunc(sysdate,'d') --返回當前星期的第一天.
2.TRUNC(for number)
描述:TRUNC函數返回處理後的數值,其工作機制與ROUND函數極為類似,只是該函數不對指定小數前或後的部分做相應舍入選擇處理,而統統截去。
文法:TRUNC(number[,decimals]),其中,number 待做截取處理的數值,decimals 指明需保留小數點後面的位元。可選項,忽略它則截去所有的小數部分。
使用方式:
TRUNC(89.985,2) = 89.98<br />TRUNC(89.985) = 89<br />TRUNC(89.985,-1) = 80
注意:注意:第二個參數可以為負數,表示為小數點左邊指定位元後面的部分截去,即均以0記。與取整類似,比如參數為1即取整到十分位,如果是-1,則是取整到十位,以此類推。