SQL Server DATEDIFF
DATEDIFF 是 SQL Server 中用于计算两个日期之间差值的函数。
基本语法
DATEDIFF(datepart, startdate, enddate)
- 返回值:整数(int)
- 注意:计算的是
enddate - startdate
常用 datepart 参数
| datepart | 缩写 | 说明 |
|---|---|---|
| year | yy, yyyy | 年 |
| quarter | qq, q | 季度 |
| month | mm, m | 月 |
| dayofyear | dy, y | 一年中的第几天 |
| day | dd, d | 天 |
| week | wk, ww | 周 |
| weekday | dw, w | 星期几 |
| hour | hh | 小时 |
| minute | mi, n | 分钟 |
| second | ss, s | 秒 |
| millisecond | ms | 毫秒 |
示例
-- 计算天数差
SELECT DATEDIFF(day, '2024-01-01', '2024-01-10') AS DaysDiff;
-- 结果:9
-- 计算小时差
SELECT DATEDIFF(hour, '2024-01-01 08:00:00', '2024-01-01 17:30:00') AS HoursDiff;
-- 结果:9
-- 计算月份差
SELECT DATEDIFF(month, '2024-01-15', '2024-03-10') AS MonthsDiff;
-- 结果:2
-- 计算年龄(按年)
SELECT DATEDIFF(year, '1990-05-20', GETDATE()) AS Age;
-- 计算两个 datetime 的分钟差
SELECT DATEDIFF(minute, '2024-01-01 23:50:00', '2024-01-02 00:10:00') AS MinutesDiff;
-- 结果:20(跨天计算)
重要注意事项
1. 边界问题
DATEDIFF 只计算边界跨越次数,不是实际的时间长度:
-- 月份差只看月份边界跨越
SELECT DATEDIFF(month, '2024-01-31', '2024-02-01');
-- 结果:1(虽然只差1天)
-- 年份差只看年份边界
SELECT DATEDIFF(year, '2024-12-31', '2025-01-01');
-- 结果:1(虽然只差1天)
2. 计算精确年龄
直接使用 DATEDIFF(year, birth, GETDATE()) 可能不准确,更好的方法:
-- 精确计算年龄
SELECT
CASE
WHEN DATEADD(year, DATEDIFF(year, birth, GETDATE()), birth) > GETDATE()
THEN DATEDIFF(year, birth, GETDATE()) - 1
ELSE DATEDIFF(year, birth, GETDATE())
END AS ExactAge
FROM Users;
3. 计算实际时间间隔(天、小时、分钟)
-- 精确到小数点的天数差
SELECT DATEDIFF(second, startdate, enddate) / 86400.0 AS ExactDays;
-- 获取时间差字符串
DECLARE @Start DATETIME = '2024-01-01 08:00:00'
DECLARE @End DATETIME = '2024-01-03 14:30:00'
DECLARE @Diff INT = DATEDIFF(second, @Start, @End)
SELECT
@Diff / 86400 AS Days,
(@Diff % 86400) / 3600 AS Hours,
(@Diff % 3600) / 60 AS Minutes,
@Diff % 60 AS Seconds
常见应用场景
-- 查询最近7天的订单
SELECT * FROM Orders
WHERE DATEDIFF(day, OrderDate, GETDATE()) <= 7;
-- 查询超过30天未登录的用户
SELECT * FROM Users
WHERE DATEDIFF(day, LastLoginDate, GETDATE()) > 30;
-- 计算订单处理时长(小时)
SELECT
OrderId,
DATEDIFF(hour, CreateTime, ProcessTime) AS ProcessingHours
FROM Orders;
与其他函数的对比
| 函数 | 返回值类型 | 说明 |
|---|---|---|
DATEDIFF |
int | 返回整数差值 |
DATEDIFF_BIG |
bigint | 同 DATEDIFF,返回 bigint(避免溢出) |
DATEADD |
datetime | 在日期上增加间隔 |
DATEDIFF + 计算 |
decimal | 可得到带小数的精确差值 |
如果需要处理超大范围的日期差(如几亿天),使用 DATEDIFF_BIG 替代。
网站:http://shibowl.top
github:https://github.com/hanbinjxnc
博客园:https://www.cnblogs.com/hool
博客:https://blog.shibowl.top
淘宝店:https://boxunwl.taobao.com/
作者:世博 2019年4月28日----
github:https://github.com/hanbinjxnc
博客园:https://www.cnblogs.com/hool
博客:https://blog.shibowl.top
淘宝店:https://boxunwl.taobao.com/
作者:世博 2019年4月28日----
浙公网安备 33010602011771号