由于区域设置将字符串转换为datetime时出错

Dil*_*oft 6 sql-server datetime date

我在SQL Server 2008 R2 Express的特定实例中遇到了很多困难.

我在英国,以下失败:

SELECT CAST('2012-12-31' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

错误信息:

将varchar数据类型转换为日期时间数据类型会导致超出范围的值.

Windows服务器区域设置是英式英语.我的登录区域是英式英语.排序'如果重要'是Latin1_General_CI_AS.

数据库"语言"是英语(美国),但是这与另一台服务器上的另一个实例相同,而上述SQL不会失败.

有什么想法吗?

jgl*_*uie 9

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

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

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

SET LANGUAGE English
SELECT CAST('2012-12-31' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

如果这样做,请适当地设置SQL用户的默认语言


Aar*_*and 7

不要使用YYYY-MM-DD日期文字,总是使用YYYYMMDD.无论语言环境,日期格式设置,语言设置,区域设置等如何,这都不会失败:

SELECT CAST('20121231' AS DATETIME);
Run Code Online (Sandbox Code Playgroud)

值得一读:

  • @Thierry当用户通过''20121208'作为明确的标准时,他们意味着8月12日而不是12月8日,将存储错误的日期.如果他们通过''20121612',那么他们将收到错误.顺便说一下,当你的用户将''2012-12-08'传递给Lamak的方法时,就会发生同样的事情.不同之处在于,YYYYMMDD将*始终*由SQL Server以这种方式解释,而YYYY-MM-DD将*有时*被解释为错误的方式. (3认同)