在日期之间的n天选择子序列

时间:2014-09-10 15:31:38

标签: oracle date

我希望在2日期之间每隔7天显示一次记录,如下所示

select * 
from user1.report1 
where project_name = 'F1' 
and TO_DATE(report_date, 'yyyy/mm/dd') >= TO_DATE('2013/1/1', 'yyyy/mm/dd')
and (to_date(report_date,'yyyy/mm/dd') between to_date('2013/1/1','yyyy/mm/dd') + 7
                    and current_timestamp)
order BY report_date, report_time DESC

通过参考here尝试了这一点,但没有成功

输入: 开始日期(在这种情况下,如上述声明中的2013/1/1)

预期产出: 从开始日期(2013/1/1)到当前日期的记录(1周1记录,如果开始日期是星期一,下一个记录也将是星期一,等等......)

1 个答案:

答案 0 :(得分:1)

您可以使用mod函数从给定的开始日期开始每七天获取一次,例如

SELECT *
FROM user1.report1 
WHERE project_name = 'F1' 
AND to_date(report_date,'yyyy/mm/dd') BETWEEN to_date('2013/01/01','yyyy/mm/dd')
                                          AND sysdate
AND mod(to_date(report_date,'yyyy/mm/dd') - to_date('2013/01/01','yyyy/mm/dd'), 7) = 0
ORDER BY report_date
       , report_time DESC

修改

以下查询:

WITH report1 AS
  (SELECT 'F1' project_name
        , to_char(trunc(sysdate) - (level - 1), 'yyyy/mm/dd') report_date
   FROM dual
   CONNECT BY LEVEL <= 365)
SELECT *
FROM report1
WHERE project_name = 'F1'
AND to_date(report_date,'yyyy/mm/dd') BETWEEN to_date('2014/01/01','yyyy/mm/dd')
                                          AND sysdate
AND mod(to_date(report_date,'yyyy/mm/dd') - to_date('2014/01/01','yyyy/mm/dd'), 7) = 0
ORDER BY report_date

提供以下输出:

PROJECT_NAME REPORT_DATE
------------ -----------
F1           2014/01/01  
F1           2014/01/08  
F1           2014/01/15  
F1           2014/01/22  
F1           2014/01/29  
F1           2014/02/05  
F1           2014/02/12  
F1           2014/02/19  
F1           2014/02/26  
F1           2014/03/05  
F1           2014/03/12  
F1           2014/03/19  
F1           2014/03/26  
F1           2014/04/02  
F1           2014/04/09  
F1           2014/04/16  
F1           2014/04/23  
F1           2014/04/30  
F1           2014/05/07  
F1           2014/05/14  
F1           2014/05/21  
F1           2014/05/28  
F1           2014/06/04  
F1           2014/06/11  
F1           2014/06/18  
F1           2014/06/25  
F1           2014/07/02  
F1           2014/07/09  
F1           2014/07/16  
F1           2014/07/23  
F1           2014/07/30  
F1           2014/08/06  
F1           2014/08/13  
F1           2014/08/20  
F1           2014/08/27  
F1           2014/09/03  
F1           2014/09/10  

37 rows selected 

即。如果输入过去一年中每天的记录,则输出是从指定的开始日期开始的每周记录,以及与该日期相同的一周。这就是你所要求的。如果不是你想要编辑你的问题,那么给记录形成一个输入,你希望从这个输入得到什么输出;您可能需要用语言解释实现此输出的规则。