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