1

我正在尝试从我的数据库中获取未来几天即将出生的人的数据(早些时候声明)它可以正常工作几天但是如果我将 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 才会显示,这是必需的

4

3 回答 3

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
于 2013-11-08T09:51:13.813 回答
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 子句的第二部分)才能获得即将到来的生日在明年初的学生。

编辑:如果桌子上的任何人出生于 2 月 29 日(当然是闰年),查询将失败。感谢 t-clausen.dk 指出它。

于 2013-11-08T18:53:06.857 回答
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
于 2013-11-09T01:57:11.210 回答