Oracle SQL - 前一周(周日至周六)的数据,无论何时 运行

Oracle SQL - Data from previous week (Sunday to Saturday) regardless of when it's run

我正在 Oracle 中查找从星期日开始到星期六结束的最后一周的 return 数据。这需要能够 运行 一周中的任何一天。

所以我知道这在 SQL 服务器中是可能的,因为我有报告做完全相同的事情:-

SET @startdate = DATEADD(wk, -1, DATEADD(wk, DATEDIFF(wk, 0,getdate()), -1))
SET @enddate = DATEADD(wk, DATEDIFF(wk, 0, getdate()), -1)

今天是 3 月 17 日星期五,上面的数据是 return 3 月 5 日星期日到 3 月 11 日星期六之间的数据。

我想在 Oracle 中做同样的事情。到目前为止我看过的所有地方都会得到这样的结果:-

SELECT TRUNC (SYSDATE) - (SELECT TO_CHAR (SYSDATE, 'D') FROM DUAL),
       TRUNC (SYSDATE) - (SELECT TO_CHAR (SYSDATE, 'D') + 1 FROM DUAL)
FROM DUAL

SELECT SYSDATE AS TODAYS_DATE, 
       NEXT_DAY (SYSDATE - 7, 'SAT') AS PREV_SATURDAY,
       NEXT_DAY (SYSDATE - 7, 'SUN') AS PREV_SUNDAY
FROM DUAL

我试图避免使用任何 'sysdate-7' 类型的代码,因为在这种情况下这非常笨拙 - 任何人都可以提供帮助吗?

谢谢

使用TRUNC( date_value, 'IW' )独立于NLS_TERRITORYNLS_DATE_LANGUAGE会话参数:

SELECT SYSDATE                                   AS TODAYS_DATE,
       TRUNC( SYSDATE, 'IW' )                    AS MONDAY_OF_THIS_ISO_WEEK,
       TRUNC( SYSDATE, 'IW' ) - INTERVAL '2' DAY AS PREV_SATURDAY,
       TRUNC( SYSDATE, 'IW' ) - INTERVAL '8' DAY AS PREV_SUNDAY
FROM   DUAL;

输出:

TODAYS_DATE         MONDAY_OF_THIS_ISO_ PREV_SATURDAY       PREV_SUNDAY       
------------------- ------------------- ------------------- -------------------
2017-03-17 15:45:25 2017-03-13 00:00:00 2017-03-11 00:00:00 2017-03-05 00:00:00

如果在任何给定时间点,"previous week" 表示在星期日开始的最近午夜结束的 7 天时间段,那么这样的事情应该有效:

with inputs (dt) as (
       select sysdate     from dual union all
       select sysdate + 1 from dual union all
       select sysdate + 2 from dual union all
       select sysdate + 3 from dual
     )
-- end of test data; SQL solution begins below this line
select to_char(dt, 'Dy dd-Mon-yyyy hh:mi AM') as dt,
       trunc(dt + 1, 'iw') - 8 as prev_wk_start,
       trunc(dt + 1, 'iw') - 1 as prev_wk_end
from   inputs;

DT                         PREV_WK_START         PREV_WK_END
------------------------   -------------------   -------------------
Fri 17-Mar-2017 10:58 AM   03/05/2017 00:00:00   03/12/2017 00:00:00
Sat 18-Mar-2017 10:58 AM   03/05/2017 00:00:00   03/12/2017 00:00:00
Sun 19-Mar-2017 10:58 AM   03/12/2017 00:00:00   03/19/2017 00:00:00
Mon 20-Mar-2017 10:58 AM   03/12/2017 00:00:00   03/19/2017 00:00:00

注意:每当我们处理时间间隔时,我们必须决定是否包括端点。在大多数情况下,最好(也是最常用)的约定是包含开始 date/time,而不包含结尾 date/time。上面的查询与这种解释是一致的。如果查询 运行 的输入如 date '2017-03-19',即周日开始的午夜,则查询将 return 恰好在该日期和时间结束的一周。所有这些 "previous week" 严格先于输入 date/time,因为周的结束点不包含在 "one-week interval."