这个问题已经让我感到困扰了一段时间。最近在重新审视我几年前为客户写的一些代码时,我想知道是否有一个更优雅的解决方案来解决这个问题。
客户存储他们所有客户的信息,包括出生日期(日期时间字段)
他们每周一运行一次提取,检索任何生日将在下一周内生效的客户。
即。如果提取物是在1月1日星期一运行的,则生日在1月8日星期一(包括)之间的客户 - > 1月14日星期日将被检索。
我的解决方案是使用Datepart(dy)功能并根据客户出生日期转换为一年中的日期计算所有即将到来的生日,添加一些逻辑以包含在一年结束时运行的提取。 问题是,如果客户出生在闰年和/或提取物在2月29日之后的闰年运行,那么使用Day of year抛出结果会产生1天的结果,所以再一次我不得不添加更多的逻辑所以程序返回了预期的结果。
对于应该是一项简单的任务来说,这似乎相当过分 为简单起见,我们假设表'customer'包含4个字段,名字,姓氏,dob和地址。
关于如何简化这一点的任何建议都将非常感激
韦斯
答案 0 :(得分:4)
这样的事情对你有用吗?
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
答案 1 :(得分:3)
为什么不在今年的生日那天使用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
它选择所有生日周数比当前周数大的客户。
答案 2 :(得分:2)
我认为DATEADD应该做正确的事。
答案 3 :(得分:1)
YEAR(GETDATE() - dbo.Patients.Dob) - 1900
我可以肯定地假设你永远不会有客户在1900年之前出生
答案 4 :(得分:1)
请尝试这个。
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)
此查询将获得即将到来的生日,包括今天的生日