Oracle SQL-去年同一天(闰年证明)
我希望在oracle sql中找到去年的同一天。例如,2016年3月16日星期三将是去年的2015年3月18日星期三。所以最近的一天 以下代码在当前闰年之前一直有效,但在2016年2月29日之后失效 这是我以前的说法,但并不适用于所有日期: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
下一天(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