求编写WHERE子句:筛选今日与date_column差值在10-15天的数据
实现日期差值筛选的几种SQL写法
嘿,这个需求其实挺常见的,不用非得单独创建变量也能轻松搞定,当然用变量的方案也完全可行,我给你两种思路都梳理一下:
直接在WHERE子句中计算(最直观)
这种方式适合单次查询,不需要复用日期或差值条件的场景,不同数据库的写法略有区别:
MySQL/MariaDB
SELECT * FROM your_table -- 两种写法等价,选你看着舒服的就行 WHERE DATEDIFF(CURDATE(), date_column) > 10 AND DATEDIFF(CURDATE(), date_column) < 15; -- 或者用BETWEEN(注意是闭区间,所以要写11到14) WHERE DATEDIFF(CURDATE(), date_column) BETWEEN 11 AND 14;
DATEDIFF(a, b)会返回a - b的天数差,CURDATE()获取当前日期(不含时间)。
PostgreSQL
SELECT * FROM your_table WHERE CURRENT_DATE - date_column > INTERVAL '10 days' AND CURRENT_DATE - date_column < INTERVAL '15 days'; -- 或者转成整数天数判断 WHERE (CURRENT_DATE - date_column)::INTEGER > 10 AND (CURRENT_DATE - date_column)::INTEGER < 15;
SQL Server
SELECT * FROM your_table WHERE DATEDIFF(day, date_column, GETDATE()) > 10 AND DATEDIFF(day, date_column, GETDATE()) < 15;
这里DATEDIFF(day, 早日期, 晚日期)返回天数差,GETDATE()会带时间,如果只需要日期部分,可以换成CAST(GETDATE() AS DATE)。
使用变量的方案(更灵活)
如果后续需要频繁调整差值范围,或者多个查询要用到相同的日期/差值条件,用变量会更方便,以MySQL为例:
-- 定义变量 SET @today = CURDATE(); SET @min_day_diff = 10; SET @max_day_diff = 15; -- 查询时复用变量 SELECT * FROM your_table WHERE DATEDIFF(@today, date_column) > @min_day_diff AND DATEDIFF(@today, date_column) < @max_day_diff;
小提醒
- 确保
date_column是日期类型(比如DATE、DATETIME),如果是字符串类型,先转成日期再计算,否则会出现错误结果。 - 如果你的数据库是Oracle、SQLite等其他方言,可以告诉我,我再给你适配对应的写法~
内容的提问来源于stack exchange,提问作者Spencer B.
相关产品推荐
相关产品推荐

