我有以下查询,我用于在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');
答案 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' )