T-SQL查询可获取从今天开始+30天的确切日期

时间:2019-07-04 13:51:54

标签: sql tsql sql-server-2005

数据采用日期/时间格式,我正在尝试获取日期从今天起30天之内的行的列表。这基于SQL Server2005。

因此,在7月1日,我将获得日期为8月1日的行的列表。

示例条目为:

  

1993年7月4日,星期日,上午12:00

但是由于某种原因,我的查询似乎根本不返回任何行。

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())

3 个答案:

答案 0 :(得分:2)

要计算今天加上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,以便可以从索引中受益。

答案 1 :(得分:1)

多年前,我创建了一个名为GetJustDate的UDF,它只返回日期,并删除所有小时/分钟/秒/等。

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

答案 2 :(得分:0)

获得正确的方法非常非常简单:

SELECT DATEPART(DD, CAST(GETDATE()+30 as date )) 

尽管Datepart并不是最快的日期,所以我想首先您需要自己定义为什么需要首先检查月份,然后再检查日期。