如何查询start_date加1年在今日起5天内的记录?现有SQL不生效如何解决
问题原因
你的SQL语句存在两个核心错误导致无法得到正确结果:
- 你将
start_date +1 year放在双引号中,数据库会将这段内容识别为普通字符串,不会针对start_date字段做实际的日期运算 - 日期运算、范围判断的函数使用不规范,如果你是做周年类(比如纪念日、生日到期提醒)的查询,只需要比对月日范围的话,还需要额外处理年份逻辑,避免跨年后日期范围判断失效
修正写法
下面给出不同场景的可用写法,以最常用的MySQL为例:
按完整日期范围判断(如果你的今日实际为2021-09-05,仅需要判断加1年后的完整日期落在未来5天内)
SELECT ID, start_date FROM my_table WHERE DATE_ADD(start_date, INTERVAL 1 YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 5 DAY);
仅比对月日范围(适配你给出的示例场景,今日为2020-09-05,忽略年份只判断月日落在未来5天范围内,适合周年提醒类需求)
SELECT ID, start_date FROM my_table WHERE DATE_FORMAT(start_date, '%m%d') BETWEEN DATE_FORMAT(CURDATE(), '%m%d') AND DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 5 DAY), '%m%d');
其他常见数据库可以对应调整语法即可:
- PostgreSQL:用
start_date + INTERVAL '1 year'做日期加法,CURRENT_DATE取当前日期,TO_CHAR(start_date, 'mmdd')格式化月日 - SQL Server:用
DATEADD(YEAR, 1, start_date)做日期加法,CAST(GETDATE() AS DATE)取当前日期,FORMAT(start_date, 'MMdd')格式化月日
内容的提问来源于stack exchange,提问作者karlosuccess
相关产品推荐
相关产品推荐

