将nvarchar类型的datetime格式值转换为yyyymmdd日期格式报错问题排查
解决nvarchar转yyyymmdd日期格式报错问题
我来帮你排查这个问题,这种把存成nvarchar的日期转格式时报错的情况很常见,主要是以下几个原因,对应解决方法也给你列出来:
常见报错原因
- 日期格式解析不匹配:SQL Server默认的日期解析规则可能和你的字符串格式不对应。比如你的示例值
12-11-2020 18:15:06,如果系统默认按mm-dd-yyyy解析,那12会被当成月份没问题,但如果你的实际数据里有13-11-2020这种日在前的情况,就会因为“月份不能为13”报错;反过来如果默认按dd-mm-yyyy解析,遇到12-01-2020也可能出错。 - 存在无效的脏数据:你的列里可能混进了不符合日期格式的内容,比如空字符串、乱码、或者像
2020-02-30这种不存在的日期,直接转换就会触发报错。
针对性解决方法
1. 指定正确的格式代码进行转换
首先要明确你的字符串日期是dd-mm-yyyy hh:mm:ss还是mm-dd-yyyy hh:mm:ss,然后用CONVERT函数指定对应的style参数来解析:
如果是dd-mm-yyyy格式(日-月-年)
用style=103(对应英国/法国日期格式,支持-或/分隔符)先转成datetime,再用style=112转成yyyymmdd格式:
SELECT CONVERT(varchar(8), CONVERT(datetime, YourColumnName, 103), 112) AS FormattedDate FROM YourTableName
如果是mm-dd-yyyy格式(月-日-年)
用style=101(美国日期格式)来解析:
SELECT CONVERT(varchar(8), CONVERT(datetime, YourColumnName, 101), 112) AS FormattedDate FROM YourTableName
2. 处理脏数据避免整体报错
如果不确定列里有没有无效数据,可以用TRY_CONVERT替代CONVERT,它会在转换失败时返回NULL而不是让整个查询报错,还可以用CASE语句标记无效数据:
SELECT CASE WHEN TRY_CONVERT(datetime, YourColumnName, 103) IS NOT NULL THEN CONVERT(varchar(8), TRY_CONVERT(datetime, YourColumnName, 103), 112) ELSE '无效日期' -- 也可以返回NULL END AS FormattedDate FROM YourTableName
总结一下你可能踩的坑
- 转换时没指定
style参数,SQL Server用默认规则解析,和你的实际日期格式不匹配 - 忽略了列中的脏数据,导致个别无效值触发整个查询报错
- 搞混了日期字符串里的日和月顺序,导致逻辑上的解析错误
内容的提问来源于stack exchange,提问作者djohnjohn
相关产品推荐
相关产品推荐

