SYSDATE在两个字段中的日期之间为6个月的时间段Q.

时间:2014-04-11 13:28:44

标签: oracle

我试图在过去的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

1 个答案:

答案 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

如果我解释正确,这是您要搜索的时间段? 对于答案的第二部分,我需要知道以下内容:

  1. MOPSTARTMOPEND中的任何一个都可以为空吗?如果是这样,您希望如何处理这些行?
  2. 是否要包含终点,即MOPSTART> = t1的行?或者仅限于MOTSTART> T1?
  3. 与(2)相同,但对于MOPEND
  4. 你想在哪个月分组(见下文)?
  5. 例如,在行(a)中,您想要每个月计算一次,还是仅在JAN(已启动)或仅在JUN(已结束)中计算一次?

          JAN FEB MAR APR MAY JUN
    a:      |-------------------|
    b:      |---|---|
    c:                      |---|
    d:                      |-----------|
    e:  |--------|