簡體   English   中英

Oracle SQL-去年同一天((年證明)

[英]Oracle SQL - Same day last year (leap year proof)

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

以下代碼在當前閏年之前運作良好並且在2016年2月29日之后破裂。

這是我的舊陳述,它不適用於所有日期:

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

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

我認為這可能是正確的

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM