首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL语句返回4年前4月4日

SQL语句返回4年前4月4日
EN

Stack Overflow用户
提问于 2012-06-08 20:25:26
回答 3查看 413关注 0票数 2

如何回到去年4月4日(从今天开始),减去4年,并返回该日期?

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

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

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-08 20:42:38

我找不到更好的方法来做这件事--我通常依靠我那对久经考验的真实的DATEADD/DATEDIFF来计算日期,但是我想不出一种方法来考虑我们整齐地度过了一年有多远-所以我们也得到了一个CASE表达式:

代码语言:javascript
复制
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')

对于测试特定日期以检查边缘条件:

代码语言:javascript
复制
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日,那么

代码语言:javascript
复制
DATEADD(year, DATEDIFF(year, '20010101', @dt), '19970404') 

就足够了。

票数 2
EN

Stack Overflow用户

发布于 2012-06-08 20:43:11

我会使用类似这样的东西:

代码语言:javascript
复制
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是今天或今天之前’),并根据该检查返回日期。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 20:42:39

像这样怎么样?

代码语言:javascript
复制
declare @date datetime = getdate()

select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10948818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档