在选择查询中获取上一周的日期

时间:2017-09-11 07:19:58

标签: sql oracle date select difference-between-rows

我有以下查询,我用于在Cognos中进行报告。我周一从周一到周日每周都会报告前一周。

目前这个日期是硬编码的,但我想让它变得动态,以便每当我在星期一运行此报告时,我都不必更改前一周的日期。

我可以在select query中使用sysdate之类的东西使DAY_DATE动态化吗?

select ID,NAME,DAY_DATE      
from TEST_REPORT 
WHERE DAY_DATE BETWEEN to_date ('20170904', 'YYYYMMDD') and to_date ('20170910', 'YYYYMMDD');

1 个答案:

答案 0 :(得分:1)

您可以使用TRUNC (date)功能从当前日期开始计算上周的开始和结束日期。

假设您在星期一2017-09-11运行查询,然后在星期五2017-09-15运行查询,并且查询必须始终生成上周的报告。
此查询计算当前周的开始日期:

SELECT trunc( date '2017-09-11', 'IW' ) as x,
       trunc( date '2017-09-15', 'IW' ) as y
from dual;

X                Y               
---------------- ----------------
2017/09/11 00:00 2017/09/11 00:00

要计算前一周的开始日期,请从上述日期减去1天,然后再次使用TRUCT:

SELECT trunc( trunc( date '2017-09-11', 'IW' ) - 1, 'IW') as start_last_week,
       trunc( trunc( date '2017-09-15', 'IW' )  - 1, 'IW') as start_last_week1
from dual;

START_LAST_WEEK  START_LAST_WEEK1
---------------- ----------------
2017/09/04 00:00 2017/09/04 00:00

因此,在您的查询中只使用此子句(日期> =而不是上周的开始和<当前周的开始):

WHERE DAY_DATE>= trunc( trunc( sysdate, 'IW' )  - 1, 'IW') 
  and DAY_DATE < trunc( sysdate, 'IW' )