Sql server 由于区域设置,将字符串转换为日期时间时出错

Sql server 由于区域设置,将字符串转换为日期时间时出错,sql-server,datetime,date,Sql Server,Datetime,Date,在SQLServer2008R2 Express的一个特定实例中,我在使用语言环境方面遇到了很多困难 我在英国,以下几点失败了: SELECT CAST('2012-12-31' AS DATETIME) 错误消息: 将varchar数据类型转换为datetime数据类型导致值超出范围 Windows服务器区域设置为英式英语。我的登录地点是英式英语。排序规则“如果这很重要”是拉丁文1_General_CI_AS 数据库“语言”是英语(美国),但这与另一台服务器上的另一个实例相同,并且上面的SQ

在SQLServer2008R2 Express的一个特定实例中,我在使用语言环境方面遇到了很多困难

我在英国,以下几点失败了:

SELECT CAST('2012-12-31' AS DATETIME)
错误消息:

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

Windows服务器区域设置为英式英语。我的登录地点是英式英语。排序规则“如果这很重要”是拉丁文1_General_CI_AS

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


有什么想法吗?

您应该在转换上明确定义日期格式,在本例中为120:

SELECT CONVERT(DATETIME,'2012-12-31',120)
您可以查看此页面以查看更多日期格式:

对于建立数据库连接的用户(SQL用户),请将语言设置为英语

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

SET LANGUAGE English
SELECT CAST('2012-12-31' AS DATETIME)
检查这是否是问题的一种方法。。。在ManagementStudio中运行此命令,并以发出查询的SQL用户身份登录

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

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

不要对日期文本使用
YYYY-MM-DD
,请始终使用
YYYYMMDD
。无论区域设置、日期格式设置、语言设置、区域设置等如何,此操作都不会失败:

SELECT CAST('20121231' AS DATETIME);
也许值得一读:


我不同意解决方案是让所有用户使用相同的语言。如果他们的语言是有目的的,因为它被用于其他事情呢?修复每个用户也是一件单调乏味的事情,因为每次创建新用户时,代码可能会开始失败,直到您修复它为止。如果你修正了代码,你就修正了问题。这并不适用于所有用户。这是一个SQL登录帐户是的,当你添加一个新的SQL登录帐户并且他们的语言设置为英式时,猜猜你的代码又开始做什么了?我从来没有考虑过。我们一直只看到一两个SQL用户,专门为我们的平台服务。这在您的场景中是不合适的。然而,这会让你“启动并运行”,直到查询被清除,产品被彻底测试。问题是,这应该是一个真实系统的复制品。实时设置实际上可以工作,并且似乎使用相同的配置。我意识到我可以强制转换etc,但我无法更改镜像系统。如果用户将日期保存为YYYYDDMM,会发生什么情况?sql永远不会知道,最终你会发现一大堆很难确定的错误。如拉马克所说,使用日期格式转换要安全得多。@Thierry当用户将
'20121208'
作为明确的标准传递时,他们的意思是8月12日而不是12月8日,将存储错误的日期。如果他们通过了“20121612”,那么他们将收到一个错误。顺便说一句,当用户将
'2012-12-08'
传递给Lamak的方法时,会发生完全相同的事情。不同之处在于,SQL Server总是以这种方式解释YYYYMMDD,而YYYY-MM-DD有时会以错误的方式解释。我明白了,谢谢您提供的信息。我问这个问题是因为在我工作的地方,区域设置是yyyddmm,因为我们对我们的客户强制执行它,但是本地设置默认为ddmmyyy,并且经常导致日期混淆。