Oracle SQL - 去年同一天(闰年证明)

时间:2016-03-16 18:24:33

标签: sql date leap-year

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

以下代码在当前闰年之前运作良好,并在2016年2月29日之后破裂。

这是我的陈述,它不适用于所有日期:

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

3 个答案:

答案 0 :(得分:0)

简单地减去7 * 52 = 364天: - )

答案 1 :(得分:0)

我认为这可能是正确的

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

答案 2 :(得分:0)

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