SQL语句返回4年前的4月4日
我如何回到去年4月4日(从今天开始),减去4年,并返回该日期 我可以先检查今天的日期是在今年4月4日之前还是之后,然后再从那里开始,但我有兴趣看到解决这个问题的不同方法 这将是更大的select语句的一部分,因此自包含的select或函数将是最佳解决方案SQL语句返回4年前的4月4日,sql,sql-server-2008,Sql,Sql Server 2008,我如何回到去年4月4日(从今天开始),减去4年,并返回该日期 我可以先检查今天的日期是在今年4月4日之前还是之后,然后再从那里开始,但我有兴趣看到解决这个问题的不同方法 这将是更大的select语句的一部分,因此自包含的select或函数将是最佳解决方案 谢谢 我找不到任何更简洁的方法来做这件事-我通常依靠我那对久经考验的DATEADD/DATEDIFF来做日期计算,但我想不出一种方法来考虑我们一年中的整洁程度-因此我们也得到了一个案例表达式: select DATEADD(year, DATE
谢谢 我找不到任何更简洁的方法来做这件事-我通常依靠我那对久经考验的
DATEADD/DATEDIFF
来做日期计算,但我想不出一种方法来考虑我们一年中的整洁程度-因此我们也得到了一个案例表达式:
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 @date datetime = getdate()
select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))
我会使用类似于:
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是今天或今天之前”),并根据该检查返回日期。您能更清楚地说,您想通过SQL检索4年前4月4日的日期时间吗?所以如果现在是4月5日,你想要2008年的4月4日,如果现在是4月3日,你需要2007年的4月4日?我想你想要一个日期时间,这样的日期时间是4月4日,至少是4年前,严格地说是5年前,对吗?蒂姆,@Damien-都是正确的,对不起,我应该更具体一些。需要至少4年前,但不到5年前。如果OP希望在当前年份之前4年的4月4日,这是可行的,但如果他们想要至少4年前的4月4日(例如,考虑3月的日期)。我打算建议使用DATEPART进行一些巧妙的操作(DAYOFYEAR
但是当你不得不考虑愚蠢的闰年时,它很快就会变得不那么聪明。:-)工作起来很有魅力,谢谢你也提供了测试脚本,干杯!
declare @date datetime = getdate()
select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))
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;