【背景】
某項目中,有查詢時間段的業務需求,java代碼類似如下:
and BANKJLSJ_BANKJLSJSSJto_date( #{endDate},’yyyy-mm-dd’) and BANKJLSJ_BANKJLSJSSJ=]]> to_date(#{startDate},’yyyy-mm-dd’)
項目建設中,開發人員發現查詢時間段有漏數據的現象,當日期精確到年月日時數據是可以查看到的,但是如果時間是精確到時分秒類型的便會有數據被漏掉。
【解決】
這是學習開發人員的經驗,將以上代碼改變為如下:
and BANKJLSJ_BANKJLSJSSJto_date( #{endDate},’yyyy-mm-dd’)+1 and BANKJLSJ_BANKJLSJSSJ=]]> to_date(#{startDate},’yyyy-mm-dd’)
這樣不僅能查詢到如“2014-09-02”這樣的數據,也可以查詢到“2014-09-02 12:23:08”這樣的數據。
【實驗】
構造一個實驗環境。
createtabletest ( IDvarchar2(32) default sys_guid(), BANKJLSJ_BANKJLSJSSJ date );
插入兩條實驗數據。
insertintotest (BANKJLSJ_BANKJLSJSSJ) values(to_date(20150516,'yyyy-mm-dd')); insertintotest (BANKJLSJ_BANKJLSJSSJ) values(to_date(20150516120214,'yyyy-mm-dd hh24:mi:ss')); commit;
測試查詢結果,步驟如下
先查詢test表裡的數據情況,如下:
情況一:使用上面最初的>=和<=的條件,查詢20150516一天時間段的數據,返回一條數據結果,如下:
稍加修改,再來查詢一下,20150516一天時間段內的數據,查詢如下:
可以看到,第二次的查詢結果才是正確的,而使用范圍時學會使用“+1”的方式才是正確的,對於時間段統計的常規性用法不應想當然的用兩個等於號劃分上下限,而是應該用正確的區間進行查詢。
小知識,簡而記之。