SQL Server将varchar类型日期转换为datetime时出现超出范围错误如何解决
问题原因
你存储的日期字符串格式为dd-mm-yyyy(日-月-年),SQL Server默认的日期解析规则会优先按照当前会话的语言设置识别格式,通常默认将前两位识别为月份,21超出了月份1-12的取值范围,因此触发转换错误。
解决方案
- 方法1:使用带格式参数的
CONVERT函数
显式指定输入字符串的日期格式为105(对应dd-mm-yyyy格式),修改SQL如下:select convert(datetime, process_date, 105) dt from cardx1 - 方法2:使用
TRY_CONVERT兼容脏数据(适用于SQL Server 2012及以上版本)
如果字段中存在不符合格式的脏数据,TRY_CONVERT会将非法值返回为NULL,不会中断整个查询,也可以用来快速定位脏数据:-- 转换查询,非法日期返回NULL select try_convert(datetime, process_date, 105) dt from cardx1 -- 排查脏数据语句 select process_date from cardx1 where try_convert(datetime, process_date, 105) is null - 长期优化方案
建议直接将process_date字段的类型修改为DATE或DATETIME类型,从存储层面避免字符串格式错误、取值超出范围等问题,也能提升日期查询、计算的效率。
内容的提问来源于stack exchange,提问作者hemu_k
相关产品推荐
相关产品推荐

