日期格式存入字符类型之后,再转回datetime类型报错

背景

最近我们迁移了一批服务器,因我们在azure portal 上新开的VM暂时默认只有英文系统,所以我们在开设好的数据库服务器的时候,都会重置数据库字符排序成中文,避免出现中文乱码问题,重置参考路径。但最近有个项目反馈,迁移后出现转换datatime类型时报错。

系统环境

Microsoft SQL Server 2012 (SP3-CU2) (KB3137746) - 11.0.6523.0 (X64) 
Mar  2 2016 21:29:16 
Copyright (c) Microsoft Corporation
Web Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
 

分析过程

通过比较分析迁移前和迁移后的日期格式,发生类型转换报错的场景是,迁移前的日期存入字符类型后,再从字符类型转回datetime 就报错,报错内容如下:
消息 241,级别 16,状态 1,第 4 行
Conversion failed when converting date and/or time from character string.

通过进一步的分析验证,准确的说原来在中文环境的日期存入字符类型(即迁移前的日期存成字符类型之后),再从字符类型转回datetime类型就会报错,最新存入的日期转换是没有问题。我们先不讨论为什么要如此折腾的转换类型。通过简化代码对比如下:

 

如上图,同一天,如是中文环境日期存在字符中就是06 而英文环境就Jun ,其他都一样,上述
 
SELECT CAST('06 28 2017 10:19PM' AS DATETIME

在英文环境下就是会报错,原因是迁移后的数据库默认语言还是English与迁移前的简体中文不一致,调整就比较简单了。

 1 exec sp_configure 'show advanced options',1
 2 RECONFIGURE;
 3 
 4 exec sp_configure 'default language',30;
 5 RECONFIGURE
 6 
 7 exec sp_configure 'show advanced options',0
 8 RECONFIGURE;
 9 
10 ALTER LOGIN sa       --以SA为例
11 WITH DEFAULT_LANGUAGE = [简体中文];

把当前英文环境下已存入的几条记录JUN修改成06之后,就没有类型转换报错了,暂时没有找到上述两种日期字符类型转换datetime共存的方案,如有麻烦分享学习一下。

总结

迁移数据库服务器一定要注意字符排序,以及数据库的默认语言是否与迁移前的一致。
 

参考资料

posted @ 2017-07-02 22:47  jil.wen  阅读(523)  评论(0编辑  收藏  举报