选择4到12个月之间的记录数

时间:2014-03-13 11:38:41

标签: sql oracle select

我有一个查询来统计我表中4到12个月的记录

SELECT count(*) 
from tm_process_state 
where tstamp BETWEEN  ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) 
                 AND  LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4);

运行后我的计数值为1240,这是错误的。正在计算从2013年3月1日到2014年2月27日的记录。

我想要计算的是sysdate-90和sysdate-365之间的记录。

然后我尝试了以下条件

 tstamp < sysdate-90 and tstamp>sysdate-365

现在计数是598,这是正确的。 但是在这里,我不能像365那样给予这里(因为它根据飞跃和非闰年而变化)

任何人都可以告诉我如何改变第一个查询以显示正确的计数?

3 个答案:

答案 0 :(得分:1)

这个条件:

where tstamp BETWEEN ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) AND LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4)

开始计算月份(由于TRUNC(SYSDATE, 'MONTH'))到一个月末为什么不做:

where tstamp BETWEEN ADD_MONTHS(SYSDATE, -12) AND ADD_MONTHS(SYSDATE, -3) 

如果您担心日期的时间值,只需trunc()值:

where tstamp BETWEEN trunc(ADD_MONTHS(SYSDATE, -12)) AND trunc(ADD_MONTHS(SYSDATE, -3))

答案 1 :(得分:0)

我认为你需要这个:

select
  trunc(ADD_MONTHS(SYSDATE, -12),'MONTH') ,
  LAST_DAY(ADD_MONTHS(SYSDATE, -4))
from dual;

而不是:

select
  ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) ,
  LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4)
from dual;

请参阅此演示:http://sqlfiddle.com/#!4/d41d8/26418

答案 2 :(得分:0)

你想简单地使用sum函数

像这样

        SELECT SUM(case when transits.direction = 1 then 1 else 0 end) ,
        SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
        where t.device in ('A','B') group by t.device

我不知道您的查询中的实际情况......

SELECT  
sum(case when tstamp BETWEEN  ADD_MONTHS(trunc(SYSDATE,'MONTH'), -12) then 1 else 0 end) as yearCount ,
sum(case when LAST_DAY(TRUNC(SYSDATE, 'MONTH') - 4) then 1 else 0 end) as lastThreeMonth
FROM tm_process_state