SQL 自每年指定日期以来的天数(SQL 服务器)

SQL for amount of days since specified date each year (SQL Server)

我正在尝试获取从当前日期算起自 4 月 15 日以来的天数,不包括年份,这样无论发生什么都不会超过 365

执行时:

SELECT DATEDIFF(dd, '04/15/2015', GETDATE())

它只会在今年起作用,并且需要让它在每年都起作用。

只需将当前年份弹出到您的查询中

SELECT DATEDIFF(dd, '04/15/'+ CAST(YEAR(GETDATE()) AS CHAR(4)), GETDATE())

您需要条件逻辑来处理当年 4 月 15 日之前的日期:

SELECT (case when month(getdate()) > 4 or
                  month(getdate()) = 4 and day(getdate()) > 15
             then DATEDIFF(day, cast(year(getdate()) as varchar(255)) + '-04-15', GETDATE())
             else DATEDIFF(day, cast(year(getdate()) - 1 as varchar(255)) + '-04-15', GETDATE())

        end)
SELECT MIN(diff)
FROM ( VALUES
  ( DATEDIFF(day,DATEFROMPARTS(YEAR(GETDATE())  ,4,15),GETDATE()) )
 ,( DATEDIFF(day,DATEFROMPARTS(YEAR(GETDATE())-1,4,15),GETDATE()) )
) t(diff)
WHERE diff >= 0

您可以使用 "dy" 间隔获取 "today" 一年中到目前为止已经过去的天数。由于可能是闰年,获取 4 月 15 日的天数有点棘手。最好构造一个日期对象并要求 SQL 服务器为您将其解析为天数。

如果可以的话,我会避免在您的查询中使用日期字符串。字符串到日期的转换会花费您一些处理时间,如果涉及很多行,那么这些时间真的会加起来。此外,使用字符串会使您与该日期格式紧密结合。

如果您使用的是 SQL Server 2012 或更高版本:

SELECT DATEPART(dy, GETDATE()) - DATEPART(dy, DATEFROMPARTS(YEAR(GETDATE()), 4, 15));

对于 < SQL 服务器 2012:

SELECT DATEPART(dy, GETDATE()) 
    - DATEPART(dy, DATEADD(dd, 14, DATEADD(mm, 3, DATEADD(yy, YEAR(GETDATE())-1900, 0))));