Oracle中计算DATE1与DATE2日期差并在WHERE子句筛选30-90天的方法
解决日期差筛选的SQL实现问题
你之前用的@DATEDIFF ('difference', 'date', 'date')语法是错误的,不同数据库的日期差函数参数格式各不相同,没有这种带@的通用写法。下面针对主流数据库给出正确实现方式,核心逻辑是计算DATE1与DATE2的天数差,再在WHERE子句中限定差值范围在30到90天之间。
常见数据库的具体写法
MySQL/MariaDB
MySQL的DATEDIFF函数接受两个日期参数,返回第二个日期减第一个日期的天数差,写法如下:
SELECT * FROM 你的表名 -- 筛选DATE2比DATE1晚30-90天的记录 WHERE DATEDIFF(DATE2, DATE1) BETWEEN 30 AND 90; -- 如果需要忽略日期先后,取绝对值筛选差值在30-90天的记录 -- WHERE ABS(DATEDIFF(DATE2, DATE1)) BETWEEN 30 AND 90;
如果DATE1/DATE2是字符串类型,需要先转成日期格式:
WHERE DATEDIFF(STR_TO_DATE(DATE2, '%Y-%m-%d'), STR_TO_DATE(DATE1, '%Y-%m-%d')) BETWEEN 30 AND 90;
SQL Server
SQL Server的DATEDIFF需要指定日期部分(比如day表示天数),参数顺序是DATEDIFF(日期部分, 起始日期, 结束日期):
SELECT * FROM 你的表名 WHERE DATEDIFF(day, DATE1, DATE2) BETWEEN 30 AND 90; -- 忽略日期先后的写法 -- WHERE ABS(DATEDIFF(day, DATE1, DATE2)) BETWEEN 30 AND 90;
字符串转日期可以用CONVERT:
WHERE DATEDIFF(day, CONVERT(DATE, DATE1, 23), CONVERT(DATE, DATE2, 23)) BETWEEN 30 AND 90;
Oracle
Oracle中两个日期直接相减就会得到天数差,若要忽略时分秒的影响,可以用TRUNC截断时间部分:
SELECT * FROM 你的表名 WHERE (TRUNC(DATE2) - TRUNC(DATE1)) BETWEEN 30 AND 90; -- 忽略日期先后的写法 -- WHERE ABS(TRUNC(DATE2) - TRUNC(DATE1)) BETWEEN 30 AND 90;
注意事项
- 确保DATE1和DATE2列是日期/时间类型,如果是字符串格式,必须先转换为日期类型再计算,否则会得到错误结果。
- 注意日期参数的顺序,不同数据库的
DATEDIFF函数参数顺序可能不同,搞反会得到负数差值,影响筛选结果。
内容的提问来源于stack exchange,提问作者Little_Tomato
相关产品推荐
相关产品推荐

