DATEDIFF 函数基础语法
DATEDIFF 函数用于计算两个日期之间的差值,基本语法如下:
DATEDIFF(datepart,startdate,enddate)- datepart:指定计算差值的单位(如天、月、年等)
- startdate:起始日期
- enddate:结束日期
支持的日期单位
常见 datepart 参数值:
day或dd:天数差month或mm:月数差year或yyyy:年数差week或wk:周数差hour或hh:小时差minute或mi:分钟差second或ss:秒数差
典型使用场景
计算员工入职天数:
SELECTemployee_name,DATEDIFF(day,hire_date,GETDATE())ASdays_employedFROMemployees;计算订单处理时长(小时):
SELECTorder_id,DATEDIFF(hour,order_date,ship_date)ASprocessing_hoursFROMorders;跨数据库实现差异
MySQL/MariaDB:
DATEDIFF(enddate,startdate)-- 仅返回天数差SQL Server:
DATEDIFF(datepart,startdate,enddate)Oracle:
enddate-startdate-- 天数差MONTHS_BETWEEN(enddate,startdate)-- 月数差PostgreSQL:
DATE_PART('day',enddate-startdate)高级用法示例
计算年龄(精确到年):
SELECTname,DATEDIFF(year,birth_date,GETDATE())-CASEWHENDATEADD(year,DATEDIFF(year,birth_date,GETDATE()),birth_date)>GETDATE()THEN1ELSE0ENDASexact_ageFROMpersons;计算工作日天数(排除周末):
SELECTstart_date,end_date,DATEDIFF(day,start_date,end_date)-DATEDIFF(week,start_date,end_date)*2-CASEWHENDATEPART(weekday,start_date)=1THEN1ELSE0END+CASEWHENDATEPART(weekday,end_date)=1THEN1ELSE0ENDASwork_daysFROMprojects;性能优化建议
在 WHERE 子句中使用 DATEDIFF 时,避免对列进行函数计算:
-- 不推荐SELECT*FROMordersWHEREDATEDIFF(day,order_date,GETDATE())>30;-- 推荐SELECT*FROMordersWHEREorder_date<DATEADD(day,-30,GETDATE());对大表查询时,考虑在计算列上建立索引:
ALTERTABLEordersADDCOLUMNprocessing_daysASDATEDIFF(day,order_date,ship_date);CREATEINDEXidx_processing_daysONorders(processing_days);常见错误处理
处理 NULL 值:
SELECTDATEDIFF(day,COALESCE(start_date,'1900-01-01'),end_date)FROMtime_records;日期格式验证:
SELECTDATEDIFF(day,TRY_CONVERT(datetime,start_date_string),end_date)FROMstring_dates;特殊场景解决方案
计算闰年天数差:
SELECTDATEDIFF(day,'2020-02-28','2020-03-01')ASleap_year_diff;-- 返回2处理时区差异:
SELECTDATEDIFF(hour,SWITCHOFFSET(start_datetime,'-08:00'),SWITCHOFFSET(end_datetime,'-05:00'))FROMglobal_events;