Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL—前一周(星期日至星期六)的数据,无论何时';快跑_Sql_Oracle_Date Arithmetic - Fatal编程技术网

Oracle SQL—前一周(星期日至星期六)的数据,无论何时';快跑

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

我希望在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日星期六之间的数据

我想在甲骨文中做同样的事情。到目前为止,我所看到的每一个地方都有这样的结果:-

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-在大多数情况下,最后一个不等式应该是<,而不是