日期格式存入字符类型之后,再转回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共存的方案,如有麻烦分享学习一下。

总结

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

参考资料

转载于:https://www.cnblogs.com/jil-wen/p/7107571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值