我如何回到去年4月4日(从今天开始),减去4年,并返回该日期?
我可以先检查今天的日期是在今年4月4日之前还是之后,然后从那里开始,但我有兴趣看到这个问题的不同方法。
这将是更大的select语句的一部分,因此自包含的SELECT或函数将是最佳解决方案。
谢谢!
答案 0 :(得分:2)
我找不到任何更简洁的方法 - 我通常会依靠我经过验证的真DATEADD/DATEDIFF
对进行日期计算,但我想不出有办法考虑到有多远通过这一年我们很整齐 - 所以我们也得到CASE
表达式:
select DATEADD(year,
DATEDIFF(year,'20010101',CURRENT_TIMESTAMP)
- CASE WHEN DATEPART(month,CURRENT_TIMESTAMP) IN (1,2,3) THEN 1
WHEN DATEPART(month,CURRENT_TIMESTAMP) = 4 AND
DATEPART(day,CURRENT_TIMESTAMP) < 4 THEN 1
ELSE 0 END
,'19970404')
测试特定日期以检查边缘条件:
declare @dt datetime
set @dt = '20120403'
select DATEADD(year,
DATEDIFF(year,'20010101',@dt)
- CASE WHEN DATEPART(month,@dt) IN (1,2,3) THEN 1
WHEN DATEPART(month,@dt) = 4 AND
DATEPART(day,@dt) < 4 THEN 1
ELSE 0 END
,'19970404')
如果您只需要在当年4年前的4月4日,那么
DATEADD(year, DATEDIFF(year, '20010101', @dt), '19970404')
就足够了。
答案 1 :(得分:1)
我会使用类似的东西:
SELECT CASE
WHEN SIGN(DATEDIFF(DAYOFYEAR, GETDATE(), STR(DATEPART(YY, GETDATE())) + '-04-04')) = 1
THEN DATEADD(YY, -4, STR(DATEPART(YY, GETDATE()) - 1) + '-04-04')
ELSE DATEADD(YY, -4, STR(DATEPART(YY, GETDATE())) + '-04-04')
END;
编辑:
这将检查4月4日和今天之间的差异是否为正(“4/4将在今年晚些时候”)或零/负('4/4是今天或今天之前')并根据该检查返回日期
答案 2 :(得分:0)
这样的事情
declare @date datetime = getdate()
select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))