SQL Server升级后同排序规则下日期解析差异问题求助
SQL Server 2019升级后日期解析异常排查
问题背景
我们开发的适配SQL Server的细分行业软件,在客户将SQL Server从2014(Version12)升级到2019(Version15)后出现日期解析问题。最初怀疑服务器排序规则不符,调整后客户服务器与内部测试服务器均采用Latin1_General_CI_AS排序规则,但问题仍未解决。
测试脚本及现象
测试脚本1
declare @x1 as datetime set @x1 = '20231231' --set @x1 = '2023-12-31' --set @x1 = '12.31.2023' select @x1
'20231231'格式在两台服务器均能正常解析'2023-12-31'和'12.31.2023'仅在客户服务器可正常解析,内部测试服务器解析失败
测试脚本2
DECLARE @T1 AS DATE DECLARE @T2 AS DATE DECLARE @T3 AS DATE DECLARE @T4 AS DATE DECLARE @nT1 AS VARCHAR(10) DECLARE @nT2 AS VARCHAR(10) DECLARE @nT3 AS VARCHAR(10) DECLARE @nT4 AS VARCHAR(10) set @nT1 = '2023-10-24' set @nT2 = '20231024' set @nT3 = '24.10.2023' set @nT4 = '2023.10.24' set @T1 = cast(@nT1 as date) set @T2 = cast(@nT2 as date) set @T3 = cast(@nT3 as date) set @T4 = cast(@nT4 as date) select @t1, @t2, @t3, @t4, @nt1, @nt2, @nt3, @nt4
- 该脚本在内部测试服务器可正常执行
- 客户服务器无法转换
@T3对应的'24.10.2023'格式
注:当前存储过程参数采用VARCHAR类型定义,暂时无法修改。
排查方向
问题根源并非排序规则,而是SQL Server的语言/区域会话设置,日期解析逻辑依赖于当前会话的语言对应的日期格式模板,而非仅服务器排序规则:
- 对比两台服务器的默认语言:执行
SELECT @@LANGUAGE,确认输出是否一致 - 检查会话级日期格式设置:执行
SELECT DATEFORMAT,查看两台服务器的日期格式(如DMY/MDY/YMD)差异 - 确认服务器级默认语言配置:执行
sp_configure 'default language',检查默认语言ID是否相同 - 排查SQL Server版本行为差异:2019对日期格式解析的严格性可能有调整,比如默认启用的严格日期校验规则不同
临时解决方案(无需修改参数类型)
在存储过程中显式指定日期格式,或使用CONVERT函数指定固定样式号:
-- 方法1:显式设置日期格式为日.月.年 SET DATEFORMAT DMY; SET @T3 = CAST(@nT3 AS DATE); -- 方法2:使用CONVERT指定样式号(104对应dd.mm.yyyy格式) SET @T3 = CONVERT(DATE, @nT3, 104);
内容的提问来源于stack exchange,提问作者TheKDude
相关产品推荐
相关产品推荐

