Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语句返回4年前的4月4日_Sql_Sql Server 2008 - Fatal编程技术网

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

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

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

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

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


谢谢

我找不到任何更简洁的方法来做这件事-我通常依靠我那对久经考验的
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;