SQL Server 日期格式转换详解

星野
星野
发布时间:2026-10-14| 2人浏览过
原创

在 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 优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。