SQL Server中dd/mm/yy格式字符串转日期失败的问题排查
问题分析与解决方案
核心结论
你的猜测完全正确:当未明确指定日期格式时,SQL Server会依据当前会话的日期格式/语言设置解析字符串,默认环境下多采用美式格式(mm/dd/yy)。当你输入13/09/22时,SQL Server会把13当作月份,因月份范围只能是1-12,所以触发转换错误;而当日部分小于12时,美式格式解析可以正常匹配,因此转换成功。
为什么你的TRY_CONVERT(...,103)无效?
格式码103对应的是**dd/mm/yyyy(四位年份),而你的字符串是dd/mm/yy(两位年份),格式不匹配,所以转换失败。你需要使用对应两位年份的格式码3**。
可行解决方案
1. 使用正确格式码的TRY_CONVERT
DECLARE @d varchar(50) = '13/09/22' SELECT TRY_CONVERT(datetime, @d, 3) -- 格式码3对应dd/mm/yy格式
2. 补全年份后转换(可自定义世纪)
如果需要明确指定年份的世纪(避免SQL Server默认的two digit year cutoff规则),可以先补全四位年份再转换:
DECLARE @d varchar(50) = '13/09/22' -- 补全为2022年,生成字符串'13/09/2022'后用格式码103转换 SELECT TRY_CONVERT(datetime, STUFF(@d, 7, 0, '20'), 103)
3. 用TRY_PARSE指定文化规则
通过指定英式文化(en-GB)强制按dd/mm/yy解析:
DECLARE @d varchar(50) = '13/09/22' SELECT TRY_PARSE(@d AS datetime USING 'en-GB')
额外说明
- SQL Server的
two digit year cutoff默认值为2049,即两位年份00-49对应2000-2049,50-99对应1950-1999,如果你的业务有特殊世纪需求,可调整该配置或手动补全年份。 - 建议后续存储日期时直接使用
date/datetime类型,避免字符串存储带来的格式解析问题。
内容的提问来源于stack exchange,提问作者Pysparker
相关产品推荐
相关产品推荐

