我试图在过去的6个月的日期范围之间设置两个不同的字段,这些字段将按月对数据进行分组。如何设置这样的from子句来实现这个目标?
SELECT TO_CHAR(mopend, 'MM-yyyy') AS month, MOPSTATUS, COUNT(*) MTS_COMPLETE_CNT
FROM MOPUSER.MOPACTIVITY
WHERE UPPER(MOPSTATUS) = 'COMPLETE'
AND TO_CHAR(MOPACTIVITY.MOPSTART, 'yyyy-mm-dd hh24:mi') BETWEEN TO_CHAR(sysdate,'YYYY-MM-DD')||' 06:02:00' AND TO_CHAR(sysdate,'YYYY-MM-DD')||' 22:59:59'
OR TO_CHAR(MOPACTIVITY.MOPEND, 'yyyy-mm-dd hh24:mi') BETWEEN TO_CHAR(SYSDATE,'YYYY-MM-DD')||' 06:02:00' AND TO_CHAR(SYSDATE,'YYYY-MM-DD')||' 22:59:59'
GROUP BY TO_CHAR(mopend, 'MM-yyyy'), MOPSTATUS
ORDER BY TO_CHAR(mopend, 'MM-yyyy'), MOPSTATUS
答案 0 :(得分:1)
我将首先回答您问题的一部分,然后根据您的意见,我可以给您完整的查询。
以下查询返回您要搜索的结束点。 T1是六个月前的早晨06:02。 T2是今天的最后一秒。
select sysdate
,add_months( trunc(sysdate) + interval '06:02' hour to minute, -6) as t1
, trunc(sysdate) + interval '23:59:59' hour to second as t2
from dual;
The above query returns the following (using yyyy-mm-dd hh24:mi:ss):
sydate: 2014-04-11 13:54:28
t1: 2013-10-11 06:02:00
t2: 2014-04-11 23:59:59
如果我解释正确,这是您要搜索的时间段? 对于答案的第二部分,我需要知道以下内容:
MOPSTART
或MOPEND
中的任何一个都可以为空吗?如果是这样,您希望如何处理这些行?例如,在行(a)中,您想要每个月计算一次,还是仅在JAN(已启动)或仅在JUN(已结束)中计算一次?
JAN FEB MAR APR MAY JUN a: |-------------------| b: |---|---| c: |---| d: |-----------| e: |--------|