2

我如何回到去年的 4 月 4 日(从今天开始),减去 4 年,然后返回那个日期?

我可以先检查今天的日期是在今年 4 月 4 日之前还是之后,然后从那里开始,但我很想看看解决这个问题的不同方法。

这将是更大的 select 语句的一部分,因此自包含的 SELECT 或函数将是最佳解决方案。

谢谢!

4

3 回答 3

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 日,那么

DATEADD(year, DATEDIFF(year, '20010101', @dt), '19970404') 

就足够了。

于 2012-06-08T12:42:38.423 回答
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 是今天或今天之前')并根据返回日期那张支票。

于 2012-06-08T12:43:10.953 回答
0

这样的事情怎么样

declare @date datetime = getdate()

select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))
于 2012-06-08T12:42:38.697 回答