在SQL中添加Days To Date

时间:2013-11-08 07:48:39

标签: sql-server tsql

我正在尝试从我的数据库中获取未来几天即将出生的人的数据(之前声明) 它工作正常好几天,但如果我将24天添加到当前日期的原因,这个查询将无法正常工作,而不是需要在月份中进行更改。 我想知道我该怎么办

    declare @date int=10,
@month int=0
select * from STUDENT_INFO where DATEPART(DD,STDNT_DOB) between 
DATEPART(DD,GETDATE()) and  DATEPART(DD,DATEADD(DD,@date,GETDATE()))
and
DATEPART(MM,STDNT_DOB) = DATEPART(MM,DATEADD(MM,@month,GETDATE()))

此查询工作正常,但它只检查8&之间的日期。 18

但如果我像这样使用它

declare @date int=30,
@month int=0
select * from STUDENT_INFO where DATEPART(DD,STDNT_DOB) between 
DATEPART(DD,GETDATE()) and  DATEPART(DD,DATEADD(DD,@date,GETDATE()))
and
DATEPART(MM,STDNT_DOB) = DATEPART(MM,DATEADD(MM,@month,GETDATE()))

它将不会返回任何内容,因为它还需要在月份中添加

如果我像这样使用

declare @date int=40,
@month int=0
select * from STUDENT_INFO where DATEPART(DD,STDNT_DOB) between 
DATEPART(DD,GETDATE()) and  DATEADD(DD,@date,GETDATE())
and
DATEPART(MM,STDNT_DOB) = DATEPART(MM,DATEADD(MM,@month,GETDATE()))

它会将结果返回到本月的最后一个月,但直到18/12才会显示,这是必需的

3 个答案:

答案 0 :(得分:1)

以下是解决问题的简单方法:

DECLARE @date int = 10
;WITH cte as
(
SELECT cast(getdate() as date) fromdate, 
cast(getdate() as date) todate,
1 loop
UNION ALL
SELECT cast(dateadd(year, -loop, getdate()) as date), 
cast(dateadd(year, -loop, getdate())+@date as date),
loop+1
FROM cte
WHERE loop < 200 -- go back 200 years 
                 -- (should be enough unless you are a turtle)
)
SELECT dob, name, datediff(year, dob, getdate()) will_turn 
FROM cte
JOIN (values(cast('1968-11-11' as date), 'Jack'), 
            (cast('1984-11-12' as date), 'Jill'), 
            (cast('1984-11-13' as date), 'Hans'), 
            (cast('1984-11-21' as date), 'Gretchen'), 
            (cast('1884-11-22' as date), 'Snowwhite')) x(dob, name)
ON dob BETWEEN fromdate and todate
OPTION (maxrecursion 300)

返回:

dob name    name     will_turn
1984-11-12  Jill     29
1984-11-13  Hans     29
1984-11-21  Gretchen 29
1968-11-11  Jack     45

答案 1 :(得分:0)

这对你有用吗?

declare @date int = 10
select * from STUDENT_INFO 
where DATEDIFF(DD, GETDATE(), 
               DATEFROMPARTS(DATEPART(YYYY, GETDATE()), -- this years birthday
                             DATEPART(MM, STDNT_DOB), 
                             DATEPART(DD, STDNT_DOB))) between 0 and @date
   or DATEDIFF(DD, GETDATE(), 
               DATEFROMPARTS(DATEPART(YYYY, GETDATE()) + 1, -- next years birthday
                             DATEPART(MM, STDNT_DOB), 
                             DATEPART(DD, STDNT_DOB))) between 0 and @date

这里的诀窍是让学生今年(和明年)过生日,并获得该日期之前的天数。我是通过使用学生出生日和月份创建计算字段来实现的,并且包括今天的年份。

对于即将到来的生日明年年初的学生,需要检查明年的生日(即OR条款的第二部分)。

修改:如果桌面上的任何人出现在feb / 29上(当然是闰年),查询将失败。感谢t-clausen.dk准备它。

答案 2 :(得分:0)

避免使用udf: -

create table #dob (
    name varchar(50),
    cakeday date
)
go
insert into #dob values
    ('yesterday',dateadd(yy,-50,getdate()-1)),
    ('today',dateadd(yy,-51,getdate())),
    ('ten days',dateadd(yy,-52,getdate()+10)),
    ('eleven days',dateadd(yy,-53,getdate()+11))
go
select *
from #dob d
where datepart(dayofyear,d.cakeday) 
    between datepart(dayofyear,getdate()) and datepart(dayofyear,getdate())+10

返回(2013-11-09): -

name        cakeday
today       1962-11-09
ten days    1961-11-19