MSSQL里怎么搞那个时间差计算,感觉有点绕但其实也没那么难吧
- 问答
- 2026-01-25 20:54:42
- 5
DATEDIFF - 专门算“差了多少个”
这个函数就是回答“从A时间到B时间,中间包含了多少个XX单位”的问题,它的写法很简单:
DATEDIFF (单位, 开始时间, 结束时间)
你只要告诉它你要用什么单位去量这个时间差就行,单位就是那些英文词,
DAY: 我就数天数。HOUR: 我就数小时数。MINUTE: 我就数分钟数。SECOND: 我就数秒数。MONTH,YEAR也都可以。
关键点(不绕的秘诀):DATEDIFF 看的是“边界”的数量,比如你算 DAY,它不看满不满24小时,就看日期变了多少次,举个例子就明白了:
假设你想算‘2023-10-01 23:59:59’ 和 ‘2023-10-02 00:00:01’ 差多少天。
SELECT DATEDIFF(DAY, '2023-10-01 23:59:59', '2023-10-02 00:00:01')
结果会是 1,因为从1号到2号,日期边界跨过了1次,哪怕实际只差2秒钟,它也算1天,同理,算两个时间差多少分钟,它也是数分钟这个单位的边界跨过了多少次,不看满不满60秒。

当你用 DATEDIFF 算天数时,它非常适合用来计算“经历了几个日历日”,比如计算订单创建日到今天的“自然天数”,但如果你想要精确到时分秒的“时长”,那就需要换一种思路,或者结合其他方法。
第二把神器:DATEADD - 专门做“时间加减”
计算时间差有时候不只是为了得到一个数字,可能是为了得到一个具体的时间点。DATEADD 就是干这个的:
DATEADD (单位, 要加的数量, 基准时间)
我想知道从今天开始,30天后的日期:
SELECT DATEADD(DAY, 30, GETDATE())
或者,3小时前的时刻:

SELECT DATEADD(HOUR, -3, GETDATE())
这个函数很直观,就是往一个时间点上加(或减,用负数)一定数量的时间单位。
那怎么把这两个结合起来,算出更精确的“时长”呢?
DATEDIFF 给的整数单位不够用,我想知道两个时间点之间精确的“天”数,带小数点的(像3.75天这样),这时候,思路是:先用 DATEDIFF 算最小的单位(比如秒),然后再转换成你想要的高级单位。
举个例子,计算‘2023-10-01 12:00:00’ 到 ‘2023-10-03 06:00:00’ 之间精确的天数。
- 先算总共差了多少秒:
SELECT DATEDIFF(SECOND, '2023-10-01 12:00:00', '2023-10-03 06:00:00')
结果是 140400 秒。

- 再把秒转换成天(1天=86400秒):
SELECT 140400 / 86400.0 -- 注意除数要带小数点,才能得到小数结果
结果是
625天,这样你就得到了一个精确的时长。
处理更复杂的情况:只要“工作时间”怎么办?
你觉得绕的地方可能在这:怎么排除周末、只算9点到18点这种?这个确实没有现成的函数,但思路是清晰的,就是用“笨”办法拆解。
基本逻辑是:
- 先用
DATEDIFF算出总共有多少个“完整的周”(比如从周一到周五算5个工作日),一周5天,先乘个5。 - 再看剩下的“零头天数”里,有几天是工作日,这里可以用
DATEPART函数来判断某一天是星期几(DATEPART(WEEKDAY, 日期),注意根据语言设置,周日可能是1或7,需要调整)。 - 把完整周的工作日数,加上零头天数里的工作日数,就得到了总的工作日天数。
- 如果还要精确到工作时间段内(比如9-18点),那就更复杂点,需要判断开始和结束那天的具体时间,如果是在工作时间外就调整到边界,然后每天按9小时(假设9-18点)去计算。
这个逻辑写起来代码会长一些,但每一步都不难理解,就是判断和加减,网上有很多现成的计算工作日的函数示例(常被称为“工作日函数”),你可以搜来参考,核心逻辑就是我上面说的这几步。
最后提醒几个容易踩的坑:
- 数据类型: 确保你比较的两个东西是日期时间类型(
DATETIME,DATE,DATETIME2),如果是字符串,可能因为格式不对而出错,最好用CAST或CONVERT函数转一下。 - 谁减谁:
DATEDIFF(单位, 开始, 结束),如果开始时间比结束时间晚,结果会是负数。 - 性能: 如果对海量数据用复杂的、尤其是用了函数(比如在
WHERE条件里对字段用DATEADD)的方式去算,可能会慢,尽量用最简单的方式。
不绕的诀窍就是:先明确你要的“差”是什么,是要数“过了几个日历天”(用 DATEDIFF 按天),还是要精确的“物理时长”(先算秒再转换),还是要排除周末的“工作日”(用逻辑拆解),想清楚这个,再选对应的工具和方法,一层层写下去,就没那么难了,自己拿几个例子在SQL里试一下,感受最深。
本文由帖慧艳于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://niro.haoid.cn/wenda/85914.html