Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL-去年同一天(闰年证明)_Sql_Date_Leap Year - Fatal编程技术网

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

Oracle SQL-去年同一天(闰年证明),sql,date,leap-year,Sql,Date,Leap Year,我希望在oracle sql中找到去年的同一天。例如,2016年3月16日星期三将是去年的2015年3月18日星期三。所以最近的一天 以下代码在当前闰年之前一直有效,但在2016年2月29日之后失效 这是我以前的说法,但并不适用于所有日期: 下一天(TRUNC(加上月(日期,-12),'iw')-2,到字符(日期,'DY'))只需减去7*52=364天即可:-)只需减去7*52=364天即可:-)我认为这可能是正确的 SQL测试: WITH data AS ( SELECT SY

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

以下代码在当前闰年之前一直有效,但在2016年2月29日之后失效

这是我以前的说法,但并不适用于所有日期:


下一天(TRUNC(加上月(日期,-12),'iw')-2,到字符(日期,'DY'))

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

只需减去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测试:

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

加个月([日期],-12)怎么样?

加个月([日期],-12)怎么样?

我不明白。你只想减去52*7=364天就得到一周中的同一天吗?你说的“去年的同一天”是什么意思?去年的“同一天”是当前日期-12个月或
ADD_months(SYSDATE,-12)
,至少在我的书中是这样。2016年2月29日将返回2015年2月28日。请编辑您的问题并添加您对“去年同一天”的定义。谢谢,我不明白。你只想减去52*7=364天就得到一周中的同一天吗?你说的“去年的同一天”是什么意思?去年的“同一天”是当前日期-12个月或
ADD_months(SYSDATE,-12)
,至少在我的书中是这样。2016年2月29日将返回2015年2月28日。请编辑您的问题并添加您对“去年同一天”的定义。谢谢。请注意,12月31日这一天不会返回上一年的任何一天。闰年12月30日也有同样的问题。祝您好运。@BobJarvis:这与原始查询返回的日期完全相同:-)除了返回非连续值(如
2015-12-30->2014-12-31
2015-12-31->2014-12-25
之外,没有其他解决方法。请注意,12月31日不会返回上一年的任何一天。闰年12月30日也有同样的问题。祝你好运。@BobJarvis:这与原始查询返回的日期完全相同:-)除了返回非连续值(如
2015-12-30->2014-12-31
2015-12-31->2014-12-25