Oracle SQL—前一周(星期日至星期六)的数据,无论何时';快跑
我希望在Oracle中返回从周日开始到周六结束的最后一周的数据。这需要能够运行一周中的任何一天 因此,我知道这在SQL Server中是可能的,因为我有一些报告可以做完全相同的事情:-Oracle SQL—前一周(星期日至星期六)的数据,无论何时';快跑,sql,oracle,date-arithmetic,Sql,Oracle,Date Arithmetic,我希望在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
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日星期六之间的数据
我想在甲骨文中做同样的事情。到目前为止,我所看到的每一个地方都有这样的结果:-
SELECT TRUNC (SYSDATE) - (SELECT TO_CHAR (SYSDATE, 'D') FROM DUAL),
TRUNC (SYSDATE) - (SELECT TO_CHAR (SYSDATE, 'D') + 1 FROM DUAL)
FROM DUAL
或
我试图避免任何“sysdate-7”类型的代码,因为在这种情况下,这是非常笨拙的-有人能帮我吗
谢谢使用TRUNC(date\u value,'IW')
独立于NLS\u区域
或NLS\u date\u语言
会话参数:
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
使用TRUNC(日期值,'IW')
独立于NLS\u区域
或NLS\u日期语言
会话参数执行此操作:
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
如果在任何给定的时间点,“前一周”指的是在周日开始的最近一个午夜结束的七天时间段,那么类似的事情应该会起作用:
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
注意:无论何时处理时间间隔,都必须确定是否包含端点。在大多数情况下,最好(也是使用最多)的约定是包括开始日期/时间,而不包括结束日期/时间。上述质疑与此解释一致。如果查询是针对类似于
日期“2017-03-19”
的输入运行的,即周日开始时的午夜,则查询将返回恰好在该日期和时间结束的一周。所有这些“前一周”都严格地位于输入日期/时间之前,因为一周的结束点不包括在“一周间隔”中。如果在任何给定的时间点,“前一周”指的是在星期日开始的最近一个午夜结束的七天时间段,那么类似的事情应该起作用:
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
注意:无论何时处理时间间隔,都必须确定是否包含端点。在大多数情况下,最好(也是使用最多)的约定是包括开始日期/时间,而不包括结束日期/时间。上述质疑与此解释一致。如果查询是针对类似于
日期“2017-03-19”
的输入运行的,即周日开始时的午夜,则查询将返回恰好在该日期和时间结束的一周。所有这些“前一周”都严格地位于输入日期/时间之前,因为一周的结束点不包括在“一周间隔”中。是否比MSSQL代码更笨拙?在什么方面?在方面,我需要在一周中的每一天编写代码。sysdate
是否比MSSQL代码更笨拙?笨拙?在什么方面?在关于方面,我需要对一周中可能的每一天进行编码。如果“前一周”是指从周日开始的午夜开始到七天后结束的七天时间(这似乎是一个合理的定义),那么这个解决方案就不起作用,因为星期六下午3点和第二天(星期日)上午10点的结果相同;这些日期/时间的“前一周”不同。公平地说,在您的解决方案中,您没有将任何内容“标记”为“前一周”-您只有prev_saturday等,但在我给出的两个示例中,即使是“prev_saturday”也不相同。如果“前一周”指的是从周日开始的午夜开始到恰好七天后结束的七天时间段(这似乎是一个合理的定义),那么这个解决方案就行不通了,因为它会在周六下午3点和第二天(周日)上午10点给出相同的结果;这些日期/时间的“前一周”是不一样的。公平地说,在你的解决方案中,你没有将任何东西“标记”为“前一周”-您只有prev_saturday等,但在我给出的两个示例中,即使是“prev_saturday”也不相同。谢谢-这正是我需要的。ORD_DATE>=TRUNC(SYSDATE+1,'IW')-8和ORD_-DATE@LuckySevens-在大多数情况下,最后一个不等式应该是<,而不是感谢-这正是我所需要的。ORD_-DATE>=TRUNC(SYSDATE+1,'IW')-8和ORD_-DATE@LuckySevens-在大多数情况下,最后一个不等式应该是<,而不是