github

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 替代。

posted @ 2026-05-22 17:29  博讯科技工作室  阅读(6)  评论(0)    收藏  举报

赣州博讯科技工作室

©2019

回到顶部
回到底部
公众号 视博web工作室