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
相关产品推荐
相关产品推荐

