SQL Server 中日期处理是数据库开发的基础操作,涉及日期存储、查询、计算、转换等多个场景,掌握相关函数和操作方法能有效提升开发效率,减少日期处理带来的错误。

SQL Server 常用日期数据类型
在选择日期存储类型时,需要根据实际需求选择合适的类型,避免存储冗余或精度不足的问题,常见的日期数据类型如下:
| 数据类型 | 存储范围 | 精度 | 适用场景 |
|---|---|---|---|
| date | 0001-01-01 到 9999-12-31 | 天 | 只需要存储日期不需要时间的场景 |
| time | 00:00:00.0000000 到 23:59:59.9999999 | 最高100纳秒 | 只需要存储时间不需要日期的场景 |
| datetime | 1753-01-01 到 9999-12-31 | 3.33毫秒 | 需要同时存储日期和时间的通用场景 |
| datetime2 | 0001-01-01 到 9999-12-31 | 最高100纳秒 | 需要更高精度日期时间的场景 |
| datetimeoffset | 0001-01-01 到 9999-12-31 | 最高100纳秒 | 需要存储时区信息的场景 |
常用日期获取函数
获取当前日期和时间是日期处理的基础操作,SQL Server 提供了多个函数满足不同需求:
获取当前日期时间
GETDATE() 函数返回当前数据库系统的日期和时间,返回类型为 datetime:
-- 获取当前日期时间 SELECT GETDATE() AS current_datetime;
SYSDATETIME() 函数返回更高精度的当前日期时间,返回类型为 datetime2:
-- 获取高精度当前日期时间 SELECT SYSDATETIME() AS high_precision_datetime;
获取当前日期或时间
如果只需要获取当前日期,可以使用 CONVERT 函数转换,或者使用 CAST 函数:
-- 获取当前日期的两种方式 SELECT CONVERT(date, GETDATE()) AS current_date; SELECT CAST(GETDATE() AS date) AS current_date2;
如果只需要获取当前时间,同样可以通过类型转换实现:
-- 获取当前时间 SELECT CAST(GETDATE() AS time) AS current_time;
日期计算相关函数
日期的加减、差值计算是开发中的常见需求,SQL Server 提供了对应的函数简化操作。
DATEADD 函数
DATEADD 函数用于对指定日期添加或减去指定的时间间隔,语法为 DATEADD(datepart, number, date),其中 datepart 表示要添加的时间部分,number 表示添加的数量,负数表示减去。
常见的 datepart 取值包括 year(年)、quarter(季度)、month(月)、day(日)、hour(小时)、minute(分钟)、second(秒)等。
-- 当前日期加3天 SELECT DATEADD(day, 3, GETDATE()) AS add_three_days; -- 当前日期减1个月 SELECT DATEADD(month, -1, GETDATE()) AS minus_one_month; -- 当前时间加2小时 SELECT DATEADD(hour, 2, GETDATE()) AS add_two_hours;
DATEDIFF 函数
DATEDIFF 函数用于计算两个日期之间的时间间隔,语法为 DATEDIFF(datepart, startdate, enddate),返回值为 enddate 减去 startdate 后的时间间隔数。
-- 计算两个日期相差的天数 SELECT DATEDIFF(day, '2024-01-01', '2024-01-10') AS day_diff; -- 计算当前时间和指定时间相差的小时数 SELECT DATEDIFF(hour, '2024-01-01 08:00:00', GETDATE()) AS hour_diff;
日期部分提取函数
DATENAME 函数用于返回日期指定部分的字符串名称,DATEPART 函数用于返回日期指定部分的整数值。
-- 获取当前日期是星期几(字符串) SELECT DATENAME(weekday, GETDATE()) AS weekday_name; -- 获取当前日期的月份(整数) SELECT DATEPART(month, GETDATE()) AS month_num; -- 获取当前日期是当年的第几天 SELECT DATEPART(dayofyear, GETDATE()) AS day_of_year;
日期格式转换
不同场景下需要不同的日期显示格式,CONVERT 函数和 FORMAT 函数可以实现日期格式的转换。
使用 CONVERT 函数转换
CONVERT 函数可以指定样式代码来转换日期格式,常见的样式代码如下:
- 23:yyyy-mm-dd 格式
- 120:yyyy-mm-dd hh:mi:ss 格式
- 111:yyyy/mm/dd 格式
- 112:yyyymmdd 格式
-- 转换为yyyy-mm-dd格式 SELECT CONVERT(varchar(10), GETDATE(), 23) AS date_format1; -- 转换为yyyy-mm-dd hh:mi:ss格式 SELECT CONVERT(varchar(19), GETDATE(), 120) AS date_format2; -- 转换为yyyymmdd格式 SELECT CONVERT(varchar(8), GETDATE(), 112) AS date_format3;
使用 FORMAT 函数转换
SQL Server 2012 及以上版本支持 FORMAT 函数,可以使用自定义格式字符串转换日期,更灵活:
-- 自定义格式转换 SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日 HH:mm:ss') AS custom_format1; SELECT FORMAT(GETDATE(), 'MM/dd/yyyy') AS custom_format2; SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') AS custom_format3;
日期处理常见问题及解决
日期字符串转换错误
在将字符串转换为日期时,如果字符串格式和数据库默认格式不匹配,会出现转换错误,此时需要指定转换样式或者使用 TRY_CONVERT 函数避免报错。
-- 错误示例:格式不匹配会报错 SELECT CONVERT(datetime, '2024/13/01'); -- 正确示例:指定样式转换 SELECT CONVERT(datetime, '2024/13/01', 111); -- 使用TRY_CONVERT,转换失败返回NULL不会报错 SELECT TRY_CONVERT(datetime, '2024/13/01') AS safe_convert;
日期边界问题
在使用 DATEDIFF 函数计算天数差时,需要注意函数的计算逻辑是按时间部分跨越的边界数计算,而不是实际的时间差。比如计算两个日期的差,如果只需要按日期部分计算,建议先转换为 date 类型再计算。
-- 两个时间相差不到1天,但DATEDIFF按天计算返回1
SELECT DATEDIFF(day, '2024-01-01 23:59:59', '2024-01-02 00:00:00') AS diff1;
-- 转换为date类型后计算,返回正确的1天差
SELECT DATEDIFF(day, CAST('2024-01-01 23:59:59' AS date), CAST('2024-01-02 00:00:00' AS date)) AS diff2;
总结
SQL Server 的日期处理功能丰富,掌握常用的日期数据类型、获取函数、计算函数、转换函数,能应对大部分开发场景的日期需求。在实际使用中,需要根据业务场景选择合适的日期类型,注意日期转换的兼容性和边界问题,避免不必要的错误。如果遇到复杂的日期处理需求,可以结合多个函数组合实现,提升代码的健壮性和可读性。
SQL_Server日期函数日期转换日期计算日期格式化修改时间:2026-07-04 03:33:33