【背景】
某项目中,有查询时间段的业务需求,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”的方式才是正确的,对于时间段统计的常规性用法不应想当然的用两个等于号划分上下限,而是应该用正确的区间进行查询。
小知识,简而记之。