【发布时间】:2015-08-19 19:17:13
【问题描述】:
我有一个查询,我想在其中获取一些不同时间段(本月、本周等)的数据。
对于“本周”列,我希望它获取从最近的星期一到现在的所有数据。我该怎么做?
到目前为止,我有以下 SQL:
WHERE prla.CREATION_DATE >= SYSDATE - ?
【问题讨论】:
我有一个查询,我想在其中获取一些不同时间段(本月、本周等)的数据。
对于“本周”列,我希望它获取从最近的星期一到现在的所有数据。我该怎么做?
到目前为止,我有以下 SQL:
WHERE prla.CREATION_DATE >= SYSDATE - ?
【问题讨论】:
trunc(sysdate, 'iw') 是您所追求的。 IW 是用于指定日期所在星期的星期一的格式掩码(因为星期一是一周开始的 ISO 标准)。例如:
with dates as (select trunc(sysdate, 'mm') - 10 + level dt
from dual
connect by level <= 40)
select dt
from dates
where dt >= trunc(sysdate, 'iw')
and dt <= sysdate; -- only needed if the dates in the column could be beyond now.
【讨论】:
是的,可以:但最好使用sysdate-8。因为如果当前日期与您的搜索日期相同,它将返回当前日期。例如。
select next_day(sysdate-7,'WED') from dual;
OUTPUT
19-AUG-15
而下面的将给你最后一周
select next_day(sysdate-8,'WED') from dual;
OUTPUT
12-AUG-15
【讨论】:
您应该截断当前日期。
TRUNC(SYSDATE, 'DAY')
这应该给你一周的第一天,在很多国家是星期一。
如果它给你上一个星期日,你应该这样做。
TRUNC(SYSDATE, 'DAY')+1
【讨论】:
trunc(sysdate) 与 trunc(sysdate, 'dd') 相同。
我发现现在可以这样做:
select next_day (sysdate-7, 'MONDAY') Last_Monday from dual;
所以在我的情况下,我们可以删除 SYSDATE 减法,它很简单:
prla.CREATION_DATE >= next_day (sysdate-7, 'MONDAY')
【讨论】: