PHP+MySQL项目:查询过期体检证用户的SQL语句错误排查
SQL语句错误分析与修复
错误原因
你的SQL语句核心逻辑存在错误:
- 在WHERE子句中,
(data_scadenza_certificato_medico = DATE_ADD(data_scadenza_certificato_medico, INTERVAL 1 YEAR))是一个相等比较操作,它只会返回布尔值(0或1),之后用CURRENT_DATE和这个布尔值做大小对比,完全偏离了“判断当前日期是否超过签发日+1年”的需求。
正确逻辑与修复后的SQL
体检证自签发日起有效期1年,过期的判断标准是当前日期晚于签发日期加1年,或者等价的签发日期早于当前日期减1年。
修复后的SQL语句(两种等价写法):
写法一:
SELECT id, nome, cognome, data_scadenza_certificato_medico FROM tbl_tesserati WHERE CURRENT_DATE > DATE_ADD(data_scadenza_certificato_medico, INTERVAL 1 YEAR) AND rif_tbl_utenti = 1
写法二(如果data_scadenza_certificato_medico字段有索引,这种写法更利于索引命中):
SELECT id, nome, cognome, data_scadenza_certificato_medico FROM tbl_tesserati WHERE data_scadenza_certificato_medico < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR) AND rif_tbl_utenti = 1
测试数据验证
以你提供的测试记录为例:data_scadenza_certificato_medico为2023-08-20,加1年后的过期日期是2024-08-20。当当前日期为2024-08-21及以后时,该记录会被正确查询出来,符合“体检证已过期”的判断。
内容的提问来源于stack exchange,提问作者P.Davide
相关产品推荐
相关产品推荐

