SQL Server 日期格式转换详解
在 SQL Server 数据库开发中,经常需要将 datetime 或 smalldatetime 类型的值转换为字符数据以展示给前端或存入日志。本文将详细解析如何使用 CONVERT 函数配合不同的 style 参数实现精确的日期格式控制。
核心函数:CONVERT 的语法结构
SQL Server 提供 CONVERT 函数用于显式地将一种数据类型转换为另一种。在日期转换场景中,其基本语法如下:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
- expression:必须是有效的 SQL Server 表达式,通常是
GETDATE()或表中的日期字段。 - data_type:目标数据类型,常用的包括
varchar、nvarchar、char或nchar。注意:CONVERT不支持用户定义的数据类型。 - length:可选参数,指定上述字符串类型的长度。
- style:关键的日期格式样式代码(整数)。通过改变这个值,可以得到完全不同格式的字符串输出。
常用日期格式样式对照表
以下是 SQL Server 中最常用的日期转换样式。左侧为不带世纪数位(两位年,yy),右侧为带世纪数位(四位年,yyyy)。如果在基础样式码上加 100,即可获得包含四位数年份的结果。
第1步:查看标准日期格式(无时分秒)
这些样式主要用于仅显示日期的场景,例如报表中的日期列。
-- 美国风格: mm/dd/yy 或 mm/dd/yyyy
SELECT CONVERT(varchar(10), GETDATE(), 1);
-- 英国/法国风格: dd/mm/yy 或 dd/mm/yyyy
SELECT CONVERT(varchar(10), GETDATE(), 3);
-- 德国风格: dd.mm.yy 或 dd.mm.yyyy
SELECT CONVERT(varchar(10), GETDATE(), 4);
-- ISO 国际标准: yymmdd 或 yyyyMMdd
SELECT CONVERT(varchar(8), GETDATE(), 112);
-- 简单日期: yyyy-MM-dd
SELECT CONVERT(varchar(10), GETDATE(), 23);
-- 完整日期: yyyy-MM-dd HH:mm:ss
SELECT CONVERT(varchar(19), GETDATE(), 20);
第2步:查看带时间的复杂格式
当需要记录日志或生成唯一标识符时,通常使用包含毫秒甚至 AM/PM 的格式。
-- 默认长日期时间: Mon DD YYYY HH:MIAM/PM
SELECT CONVERT(varchar(100), GETDATE(), 0); -- 或 100
-- 24小时制: HH:MM:SS
SELECT CONVERT(varchar(8), GETDATE(), 8); -- 或 108
-- 带毫秒的24小时制: HH:MM:SS.mmm
SELECT CONVERT(varchar(12), GETDATE(), 14); -- 或 114
-- ODBC 规范(无毫秒): yyyy-mm-dd hh:mm:ss
SELECT CONVERT(varchar(19), GETDATE(), 120);
-- ODBC 规范(含毫秒): yyyy-mm-dd hh:mm:ss.mmm
SELECT CONVERT(varchar(24), GETDATE(), 121);
-- ISO8601 (XML 推荐格式): yyyy-mm-ddThh:mm:ss.mmm
SELECT CONVERT(varchar(23), GETDATE(), 126);
第3步:特殊地区与文化格式
SQL Server 还支持一些特定的阿拉伯语(Hijri 历法)等其他语言环境的转换:
- Hijri 日历 (阿拉伯语):样式 130 和 131 对应科威特算法的 Hijri 格式。
- 日本风格:样式 111 采用 yy/mm/dd 格式,常用于部分亚洲业务系统。
关键注意事项与排错
两位年份的截断规则(Risk Alert)
在使用样式 0-113 等不包含 100 偏移量的短格式时,年份通常只显示两位数(yy)。SQL Server 默认根据“两位数字截止年份”配置项(默认为 2049)来解释这两个数字:
- 如果年份小于 49,被视为 20xx 年。
- 如果年份大于或等于 50,被视为 19xx 年。
建议:为避免歧义和潜在错误,在涉及跨越世纪的长期项目或数据交互时,务必始终使用加上 100 的样式码(如 101, 112, 120)来获得四位年份(yyyy)。
Smalldatetime 精度缺失
如果使用的数据源是 smalldatetime 类型,该类型本身不存储秒和毫秒。因此,无论转换样式设置为多少,秒和毫秒位置始终会显示为零(例如 :00.000)。这是数据类型本身的限制,而非转换函数的错误。
长度不足导致的截断
使用 varchar(100) 是一种通用的大容器写法以确保安全,但如果为了性能优化,可以根据具体样式计算所需的最小长度。例如,样式 23 (yyyy-mm-dd) 只需要 10 个字符;样式 121 (yyyy-mm-dd hh:mm:ss.mmm) 需要 24 个字符。
简要总结
掌握 SQL Server 的 CONVERT(style, date) 技巧是编写高质量 T-SQL 的基础。记住最核心的几个码:112(纯数字 YYYYMMDD,适合排序)、20/21(ODBC标准,易读性好)以及 101(美式显示)。在处理日期前缀和后缀拼接时,务必确保转换后的字符串长度足够,并注意两位年份带来的年份解读陷阱。
以上就是 SQL Server 日期格式转换的详细教程,更多关于 SQL 优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













