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

    总结

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

    参考资料

  • 相关阅读:
    python学习之路(3)
    扫描工具-Nikto
    python学习之路(2)(渗透信息收集)
    openvas 安装
    python 学习之路(1)
    BZOJ4004:[JLOI2015]装备购买——题解
    HDU3949:XOR——题解
    洛谷3812:【模板】线性基——题解
    BZOJ4566:[HAOI2016]找相同字符——题解
    BZOJ3238:[AHOI2013]差异——题解
  • 原文地址:https://www.cnblogs.com/jil-wen/p/7107571.html
Copyright © 2011-2022 走看看