T-SQL 查询以准确地从今天起 +30 天
T-SQL query to get a date +30 days from today exactly
数据采用 date/time 格式,我正在尝试获取日期正好在从今天起 30 天内的行列表。这是基于 SQL Server 2005。
所以在 7 月 1 日,我会得到一个日期为 8 月 1 日的行列表。
示例条目为:
Sunday, July 04, 1993 12:00 AM
但是由于某种原因,我的查询似乎 return 没有任何行。
AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate()+30)
例如,下面的查询部分可以很好地获取日期为今天的行列表:
AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate())
我几年前创建了一个名为 GetJustDate
的 UDF,其中 returns 只是日期,并删除了所有 hours/minutes/seconds/etc..
ALTER FUNCTION [dbo].[GetJustDate] (@DATE datetime)
RETURNS datetime AS
BEGIN
RETURN DATEADD(dd, 0, DATEDIFF(dd, 0, @DATE))
END
如果您使用它并向其添加 30 天,您将得到您想要匹配的未来日期...
DECLARE @FUTURE DATETIME = DATEADD(d, 30, dbo.GetJustDate(@DATE))
获得后,您可以将行中的日期(仅获取日期后)与新变量进行比较...
AND dbo.GetJustDate(a.PersonBirthdate) = @FUTURE
或者,如果您不想使用 UDF,则直接使用 DATEADD/DATEDIFF...
DECLARE @FUTURE DATETIME = DATEADD(dd, 30, DATEDIFF(dd, 0, @DATE))
AND DATEADD(dd, 0, DATEDIFF(dd, 0, a.PersonBirthdate)) = @FUTURE
要计算今天加上 30 天作为 Date
您可以使用:
DateAdd( day, 30, Cast( GetDate() as Date ) )
请注意,如果您尝试按具有该日期的 DateTime
列检索行,您将使用:
where DateAdd( day, 30, Cast( GetDate() as Date ) ) <= DateTimeColumn and
DateTimeColumn < DateAdd( day, 31, Cast( GetDate() as Date ) )
这将包括从第二天开始的午夜之前的所有时间,但不包括午夜。条件是 SARGABLE 以便它可以从索引中受益。
非常非常容易获得正确的方法是:
SELECT DATEPART(DD, CAST(GETDATE()+30 as date ))
虽然 Datepart 不是最快的,所以我想首先你需要自己定义为什么你需要先检查月份,然后再检查日期。
数据采用 date/time 格式,我正在尝试获取日期正好在从今天起 30 天内的行列表。这是基于 SQL Server 2005。
所以在 7 月 1 日,我会得到一个日期为 8 月 1 日的行列表。
示例条目为:
Sunday, July 04, 1993 12:00 AM
但是由于某种原因,我的查询似乎 return 没有任何行。
AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate()+30)
例如,下面的查询部分可以很好地获取日期为今天的行列表:
AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate())
我几年前创建了一个名为 GetJustDate
的 UDF,其中 returns 只是日期,并删除了所有 hours/minutes/seconds/etc..
ALTER FUNCTION [dbo].[GetJustDate] (@DATE datetime)
RETURNS datetime AS
BEGIN
RETURN DATEADD(dd, 0, DATEDIFF(dd, 0, @DATE))
END
如果您使用它并向其添加 30 天,您将得到您想要匹配的未来日期...
DECLARE @FUTURE DATETIME = DATEADD(d, 30, dbo.GetJustDate(@DATE))
获得后,您可以将行中的日期(仅获取日期后)与新变量进行比较...
AND dbo.GetJustDate(a.PersonBirthdate) = @FUTURE
或者,如果您不想使用 UDF,则直接使用 DATEADD/DATEDIFF...
DECLARE @FUTURE DATETIME = DATEADD(dd, 30, DATEDIFF(dd, 0, @DATE))
AND DATEADD(dd, 0, DATEDIFF(dd, 0, a.PersonBirthdate)) = @FUTURE
要计算今天加上 30 天作为 Date
您可以使用:
DateAdd( day, 30, Cast( GetDate() as Date ) )
请注意,如果您尝试按具有该日期的 DateTime
列检索行,您将使用:
where DateAdd( day, 30, Cast( GetDate() as Date ) ) <= DateTimeColumn and
DateTimeColumn < DateAdd( day, 31, Cast( GetDate() as Date ) )
这将包括从第二天开始的午夜之前的所有时间,但不包括午夜。条件是 SARGABLE 以便它可以从索引中受益。
非常非常容易获得正确的方法是:
SELECT DATEPART(DD, CAST(GETDATE()+30 as date ))
虽然 Datepart 不是最快的,所以我想首先你需要自己定义为什么你需要先检查月份,然后再检查日期。