日期:2014-05-17  浏览次数:20872 次

oracle 时间查询的问题,可能与时区相关,TRUNC函数

select count(1)
  from tbl_wftt_datasource d
 where d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
   and TRUNC(createn_submit_100020, 'MM') =
       TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
 group by TRUNC(createn_submit_100020, 'MM');

select count(1)
  from tbl_wftt_datasource d
 where d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
   and d.createn_submit_100020 < TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM');


这样两条SQL语句,查询出来的值相差一些,第二个多些。到底为什么呢,求指导?
Oracle SQL select

------解决方案--------------------
第一条有group by,有聚合自然数据会少,d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')的条件多余。

都是查询上上月的数据,尽量不要对字段做函数TRUNC(createn_submit_100020, 'MM'),大数据量时性能会降低。

推荐第二种方法。
------解决方案--------------------
select count(1)
  from tbl_wftt_datasource d
 where d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
   and TRUNC(createn_submit_100020, 'MM') =
       TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
 group by TRUNC(createn_submit_100020, 'MM');

--这个查询出来的结果是按TRUNC(createn_submit_100020, 'MM')值分组,求每一组对应的数量(count(1)),这样出来的是有多少个分组,就有多少记录。他的结果集等同于
select TRUNC(createn_submit_100020, 'MM'),count(1)
  from tbl_wftt_datasource d
 where d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
   and TRUNC(createn_submit_100020, 'MM') =
       TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
 group by TRUNC(createn_submit_100020, 'MM');

--
select count(1)
  from tbl_wftt_datasource d
 where d.createn_submit_100020 >= TRUNC(ADD_MONTHS(SYSDATE, -2), 'MM')
   and d.createn_submit_100020 < TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM');
--这个查询是直接统计符合查询条件的记录数。

两个查询意义不同,比较他们的值也没有意义。不知道楼主想问的是具体是什么
------解决方案--------------------
你这两个SQL写法就有问题。。
你要进行GroupBy为什么直接写Count出结果?