You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access SQL查询:获取两个日期范围内过生日的人员数据

MS Access 跨月查询生日人员SQL修正方案

原有语句错误原因

  • 逻辑冲突:(Month(DOB) = 11 AND Day(DOB) >= 27) AND (Month(DOB) = 12 AND Day(DOB) <= 02)要求日期同时属于11月和12月,不存在满足该条件的记录,直接导致跨月查询无结果
  • 无效范围判断:Month(DOB) > 11 AND Month(DOB) < 12没有符合要求的整数月份,该分支永远返回空
  • 运算优先级错误:Access中AND优先级高于OR,原有语句未对生日判断条件加括号分组,导致status='Active'、Year(DOB)>1753等全局筛选仅作用于最后一个条件分支

修正后语句

硬编码适配示例区间(2021-11-27 至 2021-12-02)

SELECT * 
FROM tblMembers 
WHERE 
    status='Active' 
    AND Year(DOB) > 1753
    AND (
        (Month(DOB) = 11 AND Day(DOB) >= 27)
        OR (Month(DOB) = 12 AND Day(DOB) <= 2)
    )
ORDER BY Month(DOB), Day(DOB)

通用参数化写法(兼容跨月、跨年场景)

如果需要灵活调整查询区间,不用每次修改SQL硬编码,可直接使用参数化写法,运行查询时会弹窗提示输入起止日期:

SELECT * 
FROM tblMembers 
WHERE 
    status='Active' 
    AND Year(DOB) > 1753
    AND (
        -- 区间不跨年的场景:直接匹配当年的生日日期
        (Month([StartDate]) <= Month([EndDate]) 
        AND DateSerial(Year([StartDate]), Month(DOB), Day(DOB)) BETWEEN [StartDate] AND [EndDate])
        -- 区间跨年的场景:匹配年末段或者年初段的生日
        OR (Month([StartDate]) > Month([EndDate])
        AND (DateSerial(Year([StartDate]), Month(DOB), Day(DOB)) >= [StartDate]
             OR DateSerial(Year([EndDate]), Month(DOB), Day(DOB)) <= [EndDate]))
    )
ORDER BY Month(DOB), Day(DOB)

内容的提问来源于stack exchange,提问作者Sathesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:54:06