【问题标题】:Error converting string to datetime due to locale由于语言环境,将字符串转换为日期时间时出错
【发布时间】:2012-06-04 20:04:27
【问题描述】:

我在特定 SQL Server 2008 R2 Express 实例中的语言环境方面遇到了很多困难。

我在英国,但以下失败:

SELECT CAST('2012-12-31' AS DATETIME)

错误信息:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

Windows 服务器区域设置为英式英语。我的登录语言环境是英式英语。排序规则“如果这很重要”是 Latin1_General_CI_AS。

数据库“语言”是英语(美国),但这与不同服务器上的另一个实例相同,并且上述 SQL 没有失败。

有什么想法吗?

【问题讨论】:

    标签: sql-server datetime date


    【解决方案1】:

    对于建立数据库连接的用户——SQL 用户——将语言设置为英语。

    这是特定于发出查询的连接的 SQL 用户的设置

    检查这是否是问题的一种方法...在 Management Studio 中运行它并以发出查询的 SQL 用户身份登录

    SET LANGUAGE English
    SELECT CAST('2012-12-31' AS DATETIME)
    

    如果可行,请适当设置 SQL 用户的默认语言

    【讨论】:

    • 我不同意解决方案是让所有用户使用相同的语言。如果他们的语言是故意设置的,因为它被用于其他事情怎么办?修复每个用户也很乏味,因为每次创建新用户时,代码可能会开始为他们失败,直到您修复它。如果你修复了代码,你就解决了问题。
    • 这并不适用于所有用户。这是一个 SQL 登录帐户
    • 是的,当您添加一个新的 SQL 登录帐户并将其语言设置为英国时,猜猜您的代码又开始做什么了?
    • 我从来没有考虑过。总是看到只有一两个 SQL 用户,专门为我们的平台服务。这不适合您的方案。但是,这将使您“启动并​​运行”,直到可以清除查询并对产品进行彻底测试。
    【解决方案2】:

    不要将YYYY-MM-DD 用于日期文字,始终使用YYYYMMDD。无论区域设置、日期格式设置、语言设置、区域设置等如何,这都不会失败:

    SELECT CAST('20121231' AS DATETIME);
    

    也许值得一读:

    【讨论】:

    • 当您的用户将日期保存为 YYYYDDMM 时会发生什么? sql 永远不会知道,您最终会遇到大量难以查明的错误。正如 lamak 所说,用日期格式转换更安全。
    • @Thierry 当用户通过'20121208' 作为明确的标准时,他们的意思是8 月12 日而不是12 月8 日,将存储错误的日期。如果他们通过'20121612',那么他们将收到一个错误。顺便说一句,当您的用户将'2012-12-08' 传递给 Lamak 的方法时,这些情况完全相同。不同之处在于 YYYYMMDD总是会被 SQL Server 以这种方式解释,而 YYYY-MM-DD有时会被错误地解释。
    • 我明白了,谢谢你的信息。我之所以问,是因为我在哪里工作,区域设置是 YYYYDDMM,因为我们将其强制执行给我们的客户,但本地设置默认为 DDMMYYYY,它经常导致日期混淆。
    【解决方案3】:

    你应该在你的转换上明确定义日期格式,在这种情况下是 120:

    SELECT CONVERT(DATETIME,'2012-12-31',120)
    

    您可以查看此页面以查看更多日期格式: http://msdn.microsoft.com/en-us/library/ms187928.aspx

    【讨论】:

    • 问题是这应该是实时系统的精确复制品。实时设置确实有效,并且似乎使用相同的配置。我意识到我可以投射等,但我无法更改镜像系统。
    猜你喜欢
    • 2021-01-27
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多