【问题标题】:Oracle SQL - Same day last year (leap year proof)Oracle SQL - 去年同一天(闰年证明)
【发布时间】:2016-03-16 18:24:32
【问题描述】:

我希望在 oracle sql 中找到去年的同一天。例如,2016 年 3 月 16 日星期三将是去年的 2015 年 3 月 18 日星期三。所以最近的一天。

以下代码在当前闰年之前运行良好,并在 2016 年 2 月 29 日之后中断。

这是我的旧声明,不适用于所有日期:

NEXT_DAY(TRUNC(ADD_MONTHS(date, -12), 'iw')-2, TO_CHAR(date, 'DY'))

【问题讨论】:

  • 我不明白。您是否只想准确减去 52*7 = 364 天以获得相同的星期几?
  • “去年的同一天”是什么意思?去年的“同一天”是当前日期 - 12 个月或ADD_MONTHS(SYSDATE, -12),至少在我的书中。对于 2016 年 2 月 29 日,这将返回 2015 年 2 月 28 日。请编辑您的问题并添加您对“去年同一天”使用的任何定义。谢谢。

标签: sql date leap-year


【解决方案1】:

只需减去 7*52 = 364 天 :-)

【讨论】:

  • 请注意,在 12 月 31 日,这不会返回上一年的一天。在闰年的 12 月 30 日也有同样的问题。祝你好运。
  • @BobJarvis:这与原始查询返回的日期完全相同 :-) 除了返回诸如 2015-12-30 -> 2014-12-312015-12-31 -> 2014-12-25 之类的非连续值之外,没有其他解决方法
【解决方案2】:

我认为这可能是正确的

SQL 测试:

WITH data
     AS (    SELECT SYSDATE - (LEVEL - 1) this_year_date,
                    TO_NUMBER (TO_CHAR (SYSDATE - (LEVEL - 1), 'D'))
                       this_year_day_of_week,
                    ADD_MONTHS (SYSDATE - (LEVEL - 1), -12) last_year_date,
                    TO_NUMBER (
                       TO_CHAR (ADD_MONTHS (SYSDATE - (LEVEL - 1), -12), 'D'))
                       last_year_day_of_week
               FROM DUAL
         CONNECT BY LEVEL <= 300),
     crunching
     AS (SELECT data.*,
                (CASE
                    WHEN this_year_day_of_week > last_year_day_of_week
                    THEN
                       this_year_day_of_week - last_year_day_of_week
                    WHEN this_year_day_of_week = last_year_day_of_week
                    THEN
                       0
                    ELSE
                       last_year_day_of_week - this_year_day_of_week
                 END)
                   math
           FROM data)
SELECT TO_CHAR (crunching.this_year_date, 'yyyy-MM-dd Day') ty_date,
       math,
       (CASE
           WHEN math = 0
           THEN
              TO_CHAR (last_year_date, 'yyyy-MM-dd Day')
           WHEN math > 2
           THEN
              TO_CHAR ( (last_year_date - math) + 7, 'yyyy-MM-dd Day')
           ELSE
              TO_CHAR (last_year_date + math, 'yyyy-MM-dd Day')
        END)
          final_answer
  FROM crunching

SQL 小提琴:http://sqlfiddle.com/#!4/9eecb7d/18211

输出:

TY_DATE MATH FINAL_ANSWER

2016-03-17 Thursday     2   2015-03-19 Thursday 
2016-03-16 Wednesday    2   2015-03-18 Wednesday
2016-03-15 Tuesday      2   2015-03-17 Tuesday  
2016-03-14 Monday       5   2015-03-16 Monday   
2016-03-13 Sunday       5   2015-03-15 Sunday   
2016-03-12 Saturday     2   2015-03-14 Saturday 
2016-03-11 Friday       2   2015-03-13 Friday   
2016-03-10 Thursday     2   2015-03-12 Thursday 
2016-03-09 Wednesday    2   2015-03-11 Wednesday
2016-03-08 Tuesday      2   2015-03-10 Tuesday  
2016-03-07 Monday       5   2015-03-09 Monday   
2016-03-06 Sunday       5   2015-03-08 Sunday   
2016-03-05 Saturday     2   2015-03-07 Saturday 
2016-03-04 Friday       2   2015-03-06 Friday   
2016-03-03 Thursday     2   2015-03-05 Thursday 
2016-03-02 Wednesday    2   2015-03-04 Wednesday
2016-03-01 Tuesday      2   2015-03-03 Tuesday  
2016-02-29 Monday       5   2015-03-02 Monday   
2016-02-28 Sunday       6   2015-03-01 Sunday   
2016-02-27 Saturday     1   2015-02-28 Saturday 
2016-02-26 Friday       1   2015-02-27 Friday   
2016-02-25 Thursday     1   2015-02-26 Thursday 
2016-02-24 Wednesday    1   2015-02-25 Wednesday
2016-02-23 Tuesday      1   2015-02-24 Tuesday  
2016-02-22 Monday       1   2015-02-23 Monday   
2016-02-21 Sunday       6   2015-02-22 Sunday   
2016-02-20 Saturday     1   2015-02-21 Saturday 
2016-02-19 Friday       1   2015-02-20 Friday   
2016-02-18 Thursday     1   2015-02-19 Thursday 
2016-02-17 Wednesday    1   2015-02-18 Wednesday

【讨论】:

    【解决方案3】:

    add_months( [date], -12 ) 怎么样?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2016-06-17
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多