SQL中计算启动日与截止日间隔天数及平均值的实现方法
计算日期间隔天数并求平均值的SQL实现方案
刚接触SQL不用慌,我来一步步帮你实现这个需求——先给每条记录算出Launched和Deadline的间隔天数(新增Duration列),再算出这些天数的平均值,还能把明细和平均值放在同一个结果里展示。
第一步:计算每条记录的间隔天数
不同数据库计算日期差的函数略有不同,我给你列出几种常用数据库的写法,你根据自己用的数据库选就行:
- MySQL/MariaDB:用
DATEDIFF函数,参数是「结束日期,开始日期」SELECT Launched, Deadline, DATEDIFF(Deadline, Launched) AS Duration FROM 你的表名; -- 记得把这里换成你实际的数据表名称 - PostgreSQL:可以用
DATE_PART提取日期差的天数SELECT Launched, Deadline, DATE_PART('day', Deadline - Launched) AS Duration FROM 你的表名; - SQL Server:用
DATEDIFF函数指定单位为daySELECT Launched, Deadline, DATEDIFF(day, Launched, Deadline) AS Duration FROM 你的表名; - Oracle:直接用截止日期减启动日期,再用
TRUNC去掉小数部分SELECT Launched, Deadline, TRUNC(Deadline - Launched) AS Duration FROM 你的表名;
第二步:同时展示明细和平均值
如果你想把每条记录的Duration和所有天数的平均值放在同一个结果表里(就像你期望的那样,最后一行显示Avg),可以用UNION ALL把两个查询结果合并。以MySQL为例,写法是这样的:
-- 先查询所有记录的明细数据 SELECT CONVERT(Launched, CHAR) AS Launched, -- 把日期转成字符串,避免和后面的'Avg'类型冲突 CONVERT(Deadline, CHAR) AS Deadline, DATEDIFF(Deadline, Launched) AS Duration FROM 你的表名 UNION ALL -- 再查询平均值,用'Avg'标记列名 SELECT 'Avg' AS Launched, 'Avg' AS Deadline, AVG(DATEDIFF(Deadline, Launched)) AS Duration FROM 你的表名;
执行这个语句后,结果就会是你想要的格式:
| Launched | Deadline | Duration |
|---|---|---|
| 2023-01-01 | 2023-01-10 | 9 |
| 2023-02-05 | 2023-02-15 | 10 |
| Avg | Avg | 9.5 |
小提示
- 记得把语句里的「你的表名」替换成你实际使用的数据表名称;
- 如果你的日期列可能存在
NULL值,建议加上WHERE Launched IS NOT NULL AND Deadline IS NOT NULL,避免计算出无效结果。
内容的提问来源于stack exchange,提问作者user9705996
相关产品推荐
相关产品推荐

