如何使用 Firebird 根据生日筛选两个日期之间生日的人的记录



我想在我的数据库中查询生日在开始日期和结束日期之间的人。该字段与 Date 一起存储在数据库中,因此它需要选择不考虑年份的周年纪念日。我尝试使用提取等函数来获取日期和月份,但是当开始日期大于最后一天时,不会显示任何记录。有没有人在没有存储过程的情况下对此有解决方案?

如果要

忽略年份,则需要提取月份和日期并单独比较:

    月份
  • 是开始月份,日等于或大于开始日
  • 月份
  • 大于开始月份,小于结束月份
  • 月是结束月份,天数小于或等于结束日

这将为您提供以下查询:

select * 
from (
    select 
        extract(month from people.birthdate) as birthmonth, 
        extract(day from people.birthdate) as birthday, 
        * 
    from people) a
where a.birthmonth = :startmonth and a.birthday >= :startday
or a.birthmonth > :startmonth and a.birthmonth < :endmonth
or a.birthmonth = :endmonth and a.birthday <= :endday

请注意,为了清楚起见,我使用了命名参数,即使 Firebird 本身没有它们。您需要将其替换为位置参数,除非您的连接库可以为您执行此操作。

如果要提供实际的开始和结束日期作为参数,则可能需要执行一些额外的工作。

最新更新