sql - 计算列日期闰年问题
问题描述
我有一张姓名和相关生日表。我可以通过匹配数据库中的生日和当前日期之间的 MONTH 和 DAY 日期部分来检索今天生日的每个人的姓名。但是,我需要提取未来两周内所有生日的“期待”列表。
显而易见的解决方案是为每个人创建一个计算列,显示他/她的“今年生日”。很容易从生日中提取月份和日期,添加当前年份,并将整个字符串转换为日期。这样我就可以检索那些“今年的生日”在当前日期的 X 天内的人。但是,我有一个人的生日是 2 月 29 日,而且每年都没有 2 月 29 日,所以当我查询或打开表格时,计算列“阻塞”并出现以下错误:
将 char 数据类型转换为 datetime 数据类型会导致 datetime 值超出范围。
关于在这种情况下使计算列正常工作的方法,或者使用表中的出生日期进行查询的替代方法的建议?
解决方案
您的方法在 12 月底将不起作用,因为年份会发生变化。这是一种不同的方法:
- 将年数添加到日期并让数据库处理闰年。
- 然后进行比较。
所以,第一个逻辑是:
select dateadd(year, year(getdate()) - year(dob), dob)
然后在接下来的两周内获得出生日期:
where dateadd(year, year(getdate()) - year(dob), dob) >= convert(date, getdate()) and
dateadd(year, year(getdate()) - year(dob), dob) < dateadd(14, day, convert(date, getdate())
但是,这仍然不能处理可能是明年的出生日期。因此,要处理年终问题,还要考虑:
where (dateadd(year, year(getdate()) - year(dob), dob) >= convert(date, getdate()) and
dateadd(year, year(getdate()) - year(dob), dob) < dateadd(14, day, convert(date, getdate())
) or
(dateadd(year, 1 + year(getdate()) - year(dob), dob) >= convert(date, getdate()) and
dateadd(year, 1 + year(getdate()) - year(dob), dob) < dateadd(14, day, convert(date, getdate())
)
推荐阅读
- flutter - 将提供程序包添加到 Flutter Web 项目时出错
- c# - 属性路由与传统表单参数一起使用的问题
- angular - 尝试运行 Angular 8 应用程序时出现“未捕获的错误:预期的‘样式’是字符串数组”
- python - 模式弹出窗口上的单击按钮在 Selenium Python 中给我一个错误
- r - 将样本大小 (n) 添加到每个方面散点图 (R, ggpubr)
- python - 返回未失真的像素坐标而不是图像
- jenkins - 如何在 Jenkins 声明式管道中运行 XmlParser/读取 XML
- c++ - 推送向量时出现堆溢出错误
成向量 > - garbage-collection - 垃圾收集扫描阶段后未标记的块头
- spock - Spock 中的 Num*Obj 是什么意思