SQL Server 2005,从出生日期开始计算即将到来的生日

SQL Server 2005,从出生日期开始计算即将到来的生日,sql,sql-server-2005,Sql,Sql Server 2005,这个问题困扰了我一段时间了。最近,当我重温几年前为客户编写的一些代码时,我想知道是否有更优雅的解决方案来解决这个问题 客户存储其所有客户信息,包括出生日期(日期时间字段) 他们每周一运行一个摘录,检索任何生日将在下一周内的客户 即,如果摘录在1月1日星期一运行,则将检索生日介于(包括)1月8日星期一->1月14日星期日之间的客户 我的解决方案是使用Datepart(dy)函数,根据转换为一年中某一天的客户出生日期计算所有即将到来的生日,并为年底运行的提取添加一些逻辑。 问题是,如果客户出生在闰年

这个问题困扰了我一段时间了。最近,当我重温几年前为客户编写的一些代码时,我想知道是否有更优雅的解决方案来解决这个问题

客户存储其所有客户信息,包括出生日期(日期时间字段)

他们每周一运行一个摘录,检索任何生日将在下一周内的客户

即,如果摘录在1月1日星期一运行,则将检索生日介于(包括)1月8日星期一->1月14日星期日之间的客户

我的解决方案是使用Datepart(dy)函数,根据转换为一年中某一天的客户出生日期计算所有即将到来的生日,并为年底运行的提取添加一些逻辑。 问题是,如果客户出生在闰年和/或摘录在2月29日之后的闰年运行,则使用“年中的某一天”会将结果延迟1天,因此我再次不得不添加更多逻辑,以便程序返回预期结果

对于一项本应是简单的任务来说,这似乎太过分了 为简单起见,假设表“customer”包含4个字段,即名字、姓氏、dob和地址

任何关于如何简化的建议都将不胜感激

Wes

为什么不在今年的生日使用DATEPART(wk)

SET DATEFIRST 1  -- Set first day of week to monday
SELECT * FROM customer
WHERE DATEPART(wk, DATEADD(yy, DATEPART(yy, GETDATE()) - DATEPART(yy, customer.dob), customer.dob)) = DATEPART(wk, GETDATE()) + 1

它会选择所有生日周数比当前周数大一的客户。

我认为应该做正确的事情。

您想做点什么

select * from Customers c 
where dateadd(year, 1900-year(dob), dob) 
    between dateadd(year, 1900-year(getdate()), getdate())
    and dateadd(year, 1900-year(getdate()), getdate())+7
我可以放心地假设,1900年之前,您将不会有客户出生。请试试这个

SELECT TOP 10 BirthDate, FirstName
FROM Customers
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE())
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate())
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate())
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate)

此查询将获取即将到来的生日,包括今天本身

我不知道您将如何使用DateAdd。客户的目的地各不相同。。i、 e 04/01/1965、02/06/1982等。我喜欢这个解决方案。。。但是如果我们不是从周一开始,而是从周四开始呢。哦,我明白了……:)1.根据MS
SETDATE FIRST 1
不是星期天Monday@Unreason字体不,今天是星期一。见第2条。DATEPART(wk,date)是一个函数,它取决于年份,并且会波动;你应该把生日带到今年,以便进行对比测试work@Unreason当前位置我把生日带到今年,这就是dateadd的作用。当然!我现在明白了。非常感谢你的解释。现在我明白它是怎么工作的了,这看起来太明显了!一旦你陷入以同样的方式看待事物的困境,尽管你忽略了显而易见的东西。非常感谢。哦,来吧,这是苏的力量!你知道,头脑风暴。我用了30天的时间使用这种方法,但我发现它在每年的这个时候(12月15日)不起作用。看看这里的答案:?我知道这个帖子很老,但我同意汤姆的观点。
SELECT TOP 10 BirthDate, FirstName
FROM Customers
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE())
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate())
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate())
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate)