☰
SQL日期差计算完全指南
2026/11/6 3:16:00 网站建设 项目流程

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;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询