【问题标题】:How to subtract 13 weeks from a date in PL SQL?如何从 PL SQL 中的日期减去 13 周?
【发布时间】:2016-09-12 07:05:49
【问题描述】:

我在 sql 中有一个日期,它总是在星期一,我减去 13 周来获得每周报告。我试图获得相同的 13 周报告,但也包括去年的数据。

目前,我正在使用以下内容:

calendar_date >=  TRUNC(sysdate) - 91

工作正常。

去年我也需要。

但是,当我将其拆分为日历周时,也会有一个部分完整的一周,因为它将包括前一周的 1 或 2 天。我只需要整个星期。

例如去年返回的日期为 2015 年 2 月 14 日至 2015 年 5 月 16 日。我需要它从星期一开始,并且是 2015 年 2 月 16 日。这每周都会改变,因为我只对完整的几周感兴趣......

【问题讨论】:

  • 好吧,你可以只减去 52 周,这总是会给你星期一。但是您可能需要更正一年中额外的一周:如果您的公司以 13 周为单位工作,那么他们处理额外一周的逻辑是什么 - 偶尔在圣诞节期间使用 14 周?
  • 为什么把代码编辑成一模一样?此外,sql server 中不使用 trunc,所以我会说它是 PL SQL。感谢您的回答,将尝试改为几周..
  • 原始版本没有格式化为代码,尽管它也很清楚。您可以使用上面的“编辑”链接将标签放回原处或完全回滚更改。 (你可能还必须@他来引起他的注意——它把这个指向我,因为它猜到你在回复我的评论。)
  • 对,抱歉。我不是在寻找他的另一个答案,所以不用担心。

标签: sql oracle date


【解决方案1】:

我会这样做:

  • 通过减去 91 天来获取日期。
  • 使用TO_CHAR(DATE,'d')获取星期几的编号
  • 将距离下周一的天数添加到日期。

类似这样的:

SELECT TO_DATE(TO_DATE('16/05/2015','DD/MM/YYYY'),'DD/MM/YYYY')-91 + MOD(7 - TO_NUMBER(TO_CHAR(TO_DATE(TO_DATE('16/05/2015','DD/MM/YYYY'),'DD/MM/RRRR')-91,'d'))+1,7) d
FROM dual

【讨论】:

  • 一个警告:他的例子是日期后的星期一减去 91:他想要 2 月 16 日而不是 2 月 14 日。
  • 你是对的!我没有读那部分。我更改了答案,以便它返回下一个星期一而不是前一个星期一的日期。谢谢!
【解决方案2】:

next_day - 返回以 char 命名的第一个工作日的日期。

with dates as (select to_date('16/05/2015','DD/MM/YYYY') d from dual)
  select 
       trunc(next_day( trunc(d-91) - interval '1' second,'MONDAY'))
  from dates;

我想从计算日期得到下周一。在计算日期是星期一的情况下,我必须回到前一周(-1 秒)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2013-10-31
    • 2018-04-11
    • 2015-02-22
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多