SQL Server中荷兰式Varchar日期转换问题(日被误判为月份报错)
解决Varchar类型日期时间转换为Datetime的问题
这个问题我之前也碰到过,核心原因是你的字符串日期格式是日-月-年 时间(比如13-04-2018 1:05:00),而SQL Server默认会按美国式的月-日-年格式解析,把13当成月份自然就会超出范围报错。下面给你几个可行的解决方案:
方案1:用CONVERT指定正确的Style参数
SQL Server的CONVERT函数支持通过第三个参数指定日期格式的style代码,针对dd-MM-yyyy HH:mm:ss这种格式,我们可以使用style 105(对应意大利式日期格式dd-mm-yyyy),函数会自动识别后面的时间部分:
SELECT CONVERT(DATETIME, '13-04-2018 1:05:00', 105) AS ConvertedDateTime;
执行后会返回你需要的2018-04-13 01:05:00格式的datetime类型值。
方案2:用TRY_CONVERT处理异常数据
如果你的数据库里存在格式不规范的日期字符串(比如某天的日/月超出范围),直接用CONVERT会抛出错误中断查询。这时可以用TRY_CONVERT,它会在转换失败时返回NULL而不是报错,更适合批量处理数据:
SELECT TRY_CONVERT(DATETIME, '13-04-2018 1:05:00', 105) AS SafeConvertedDateTime;
你还可以搭配ISNULL或COALESCE给转换失败的记录设置默认值,比如:
SELECT ISNULL(TRY_CONVERT(DATETIME, YourDateColumn, 105), GETDATE()) AS FinalDateTime FROM YourTableName;
方案3:用PARSE/TRY_PARSE指定文化解析
如果觉得style代码不好记,也可以用PARSE函数,通过指定文化区域来明确日期格式。比如法国(fr-FR)、德国(de-DE)等地区都是采用日-月-年的日期格式:
SELECT PARSE('13-04-2018 1:05:00' AS DATETIME USING 'fr-FR') AS ParsedDateTime;
同样,为了处理异常数据,使用TRY_PARSE:
SELECT TRY_PARSE('13-04-2018 1:05:00' AS DATETIME USING 'fr-FR') AS SafeParsedDateTime;
注意事项
- 确保你的日期字符串格式是统一的
dd-MM-yyyy HH:mm:ss,如果存在单数字日/月(比如3-4-2018)或者12小时制带AM/PM的情况,需要调整对应的style或文化参数。 - 如果你使用的是SQL Server 2012及以上版本,
TRY_CONVERT和TRY_PARSE才支持,低版本请优先使用CONVERT配合数据校验。
内容的提问来源于stack exchange,提问作者JVGBI
相关产品推荐
相关产品推荐

