Oracle SQL如何计算两个日期变量差值,查找下单与发货最长间隔
问题解决方案
1. 已知语法错误修正
你当前写的SQL里FROM ORDERS o;后面多了一个分号,会直接触发语法报错,先把这个分号删掉。
2. 日期差值计算逻辑
不同数据库的日期差计算函数存在差异,常用数据库的计算方式如下:
- Oracle:直接对DATE类型做减法即可得到天数差,写法为
o.SHIPDATE - o.ORDERDATE,如果要忽略时分秒可以加TRUNC:TRUNC(o.SHIPDATE) - TRUNC(o.ORDERDATE) - MySQL:使用
DATEDIFF(结束日期, 开始日期)函数,写法为DATEDIFF(o.SHIPDATE, o.ORDERDATE) - SQL Server:使用
DATEDIFF(时间单位, 开始日期, 结束日期)函数,写法为DATEDIFF(day, o.ORDERDATE, o.SHIPDATE) - PostgreSQL:日期类型直接相减即可,写法为
(o.SHIPDATE::DATE - o.ORDERDATE::DATE)
3. 完整查询代码(通用逻辑,以MySQL为例)
如果只需要取最长间隔的1条记录,最简单的方式是按间隔倒序排序后取第一条:
SELECT o.ORDER#, o.ORDERDATE, o.SHIPDATE, o.SHIPCITY, o.SHIPSTATE, DATEDIFF(o.SHIPDATE, o.ORDERDATE) AS 发货间隔天数 FROM ORDERS o WHERE o.SHIPDATE IS NOT NULL -- 排除还没发货的订单 ORDER BY 发货间隔天数 DESC LIMIT 1;
如果你的数据库不支持LIMIT语法,对应修改即可:
- Oracle 12c+:把LIMIT 1换成
FETCH FIRST 1 ROW ONLY - SQL Server:SELECT后面加TOP 1,去掉最后一行LIMIT 1
4. 存在多条最长间隔记录的场景
如果需要把所有间隔等于最大值的记录都查出来,可以用子查询匹配最大值:
SELECT o.ORDER#, o.ORDERDATE, o.SHIPDATE, o.SHIPCITY, o.SHIPSTATE, DATEDIFF(o.SHIPDATE, o.ORDERDATE) AS 发货间隔天数 FROM ORDERS o WHERE o.SHIPDATE IS NOT NULL AND DATEDIFF(o.SHIPDATE, o.ORDERDATE) = ( SELECT MAX(DATEDIFF(SHIPDATE, ORDERDATE)) FROM ORDERS WHERE SHIPDATE IS NOT NULL );
内容的提问来源于stack exchange,提问作者Laser
相关产品推荐
相关产品推荐

