oracle 查询星期六,关于Oracle SQL:Oracle SQL-上周(星期日至星期六)的数据,无论何时运行...

我希望从星期日开始到星期六结束的最后整周返回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"也不相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值