CONVERT是SQL Server中唯一能同时完成类型转换和格式控制的函数,需用style参数实现指定日期格式输出,且varchar目标类型必须显式声明长度以防截断。

CONVERT 是 SQL Server 中唯一能**同时完成类型转换 + 格式控制**的函数。仅用 CAST 或 TRY_CAST 无法输出 “2026-05-19” 或 “05/19/2026” 这类指定格式的字符串——必须靠 CONVERT 的 style 参数。
CONVERT(datetime → varchar) 必须指定 length,否则可能截断
把日期转字符串时,varchar 类型不写长度会默认取 30,看似安全,但容易掩盖真实问题:
- 如果只想要 “YYYY-MM-DD”,用
varchar(10)更准确;写成varchar(无长度)在某些老版本或严格模式下可能报错或隐式截断 -
CONVERT(varchar, GETDATE(), 120)输出类似2026-05-19 07:13:22,实际占 19 字符;若目标字段是varchar(10)却误写成varchar,后续插入或拼接时可能被无声截断 - 建议显式声明:日期部分用
varchar(10),完整时间用varchar(19),带毫秒用varchar(23)
常用 style 值对应关系与易混淆点
不是所有 style 都“开箱即用”,有些输出含空格、AM/PM、甚至依赖语言设置:
-
style = 101→mm/dd/yyyy(如05/19/2026),但注意:它输出的是美国格式,不是国际通用;style = 111才是yyyy/mm/dd(日本/ISO 风格) -
style = 23→yyyy-mm-dd(纯日期,无时间,无空格),这是最常用于 WHERE 条件或分表名的格式 -
style = 112→yymmdd(如20260519),8 位纯数字,适合做分区键或文件名,但注意它不带分隔符,肉眼难读 -
style = 0或100→ 输出带空格和 AM/PM(如May 19 2026 7:13AM),字段长度至少要varchar(20),否则截断 - 负数 style(如
-20、-21)等价于对应正数(120、121),但更推荐用正数,可读性高且兼容性无风险
字符串转 datetime 时 style 决定输入解析逻辑
把字符串转回日期时,style 不是“美化输出”,而是告诉 SQL Server “这个字符串按什么规则去解读”:
-
CONVERT(datetime, '05/19/2026', 101)→ 正确识别为 2026 年 5 月 19 日 -
CONVERT(datetime, '19/05/2026', 103)→ 英国/法国格式,dd/mm/yyyy,也能成功 - 但
CONVERT(datetime, '20260519', 112)→ 可直接解析 8 位无分隔符数字,比CONVERT(date, '20260519')更可靠(后者依赖语言设置) - 漏写
style或写错(如用101解析'2026-05-19'),大概率抛出Conversion failed when converting date and/or time from character string
替代方案:FORMAT() 函数更灵活但性能差、版本受限
SQL Server 2012+ 提供了 FORMAT(),支持自定义模板(如 'yyyy年MM月dd日'),但它有硬伤:
- 执行速度比
CONVERT慢 3–10 倍,尤其在大结果集上做 SELECT 转换时明显卡顿 - 不走 SARGable 路径,无法利用索引;而
CONVERT(date, col, 112)在 WHERE 中仍可走索引(配合计算列或视图) - SQL Server 2008 R2 及更早版本不支持,
CONVERT兼容所有版本 - 除非真需要中文年月日、星期几、序数词(1st、2nd)等,否则优先用
CONVERT+REPLACE组合(如REPLACE(CONVERT(varchar(10), GETDATE(), 111), '/', '年') + '月' + ...)
真正麻烦的不是记不住 style 编号,而是忘记:同一个编号在「日期→字符串」和「字符串→日期」中扮演的角色完全不同——前者控制输出长相,后者决定解析逻辑。用错方向,错误往往静默发生(比如查不到数据),而不是立刻报错。










