我有一个查询来统计我表中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那样给予这里(因为它根据飞跃和非闰年而变化)
任何人都可以告诉我如何改变第一个查询以显示正确的计数?
答案 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;
答案 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