我希望从星期日开始到星期六结束的最后整周返回Oracle中的数据。 它需要能够在一周的任何一天运行。
因此,我知道这在SQL Server中是可能的,因为我的报告执行的操作完全相同:-
SET @startdate = DATEADD(wk, -1, DATEADD(wk, DATEDIFF(wk, 0,getdate()), -1))
SET @enddate = DATEADD(wk, DATEDIFF(wk, 0, getdate()), -1)
今天是3月17日星期五,上述内容将返回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'类型的代码,因为在这种情况下这非常笨拙-有人可以帮忙吗?
谢谢
sysdate是否比SQL代码还要笨拙?
笨重? 在什么方面?
关于我,我将需要在一周中的每一天进行编码。
如果在任何给定时间点,"上周"是指在星期日开始时最近的午夜结束的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 '2017-03-19'之类的输入(在星期日的开始午夜)运行的,则查询将返回恰好在该日期和时间结束的那一周。 所有这些"上周"都严格在输入日期/时间之前,因为" 1周间隔"中不包括该周的终点。
谢谢-这正是我所需要的。 ORD_DATE> = TRUNC(SYSDATE + 1,IW)-8 AND ORD_DATE <= TRUNC(SYSDATE + 1,IW)-1
@LuckySevens-在大多数情况下,最后的不平等应为
使用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
如果"上周"是指一个7天的时间段,从星期日的午夜开始,到恰好7天后结束(这似乎是一个合理的定义),则此解决方案将无法工作,因为它将在3点给出相同的结果 下午 在星期六和第二天的上午10点(星期日); 这些日期/时间的"前一周"不相同。 公平地说,在您的解决方案中,您没有将任何内容"标记"为"上周"-您只有prev_saturday等,但是在我给出的两个示例中,甚至" prev_saturday"也不相同。