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_TERRITORY
或NLS_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."
中
我正在 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_TERRITORY
或NLS_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."