SQL 服务器不接受 YYYY-MM-DD

SQL Server not accepting YYYY-MM-DD

我的本地 SQL Server 2016 安装程序在重新安装后决定不接受 YMD 日期格式。例如,以下查询在我的同事的设置中曾经并且仍然被接受:

SELECT "id"  
FROM  test.dbo.tabEmp 
WHERE  "DateAdmission"  <= '2021-12-31' AND "DateAdmission">= '2021-12-30' ` 

当我尝试 运行 时,我看到了这个:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

但是,如果我以 YYYY-DD-MM 格式将日期重写为 2021-31-122021-12-30,它们将被接受。

我无法真正对其进行转换或格式化,因为我们系统中的 sql 查询数量众多,而且这样做的方式几乎是不可能的。有什么可以做的吗?我尝试更改 windows' 日期格式但无济于事。

对于 datetimesmalldatetime 数据类型,格式 yyyy-MM-dd 而不是 明确的(请注意,它 对于较新的日期和时间数据类型)。如果您不是美国人,日期很可能会被解释为 yyyy-dd-MM,并且由于一年中没有 31 个月,您会收到错误消息。

对于SQL服务器,无论数据类型和语言设置如何,明确的格式是yyyyMMddyyyy-MM-ddThh:mm:ss.nnnnnnn;理想情况下,如果您使用字符串文字,请使用其中一种格式,因为您永远不会出错(除非您合法地拥有无效日期)。

否则,您可以使用样式代码明确 CONVERT 您的值:

SELECT CONVERT(datetime, '2021-12-31', 126);

您的新数据库实例似乎在重新安装后选择了新的语言

当前语言设置决定了所有系统消息使用的语言,以及要使用的 date/time 格式。

日期格式设置会影响字符串在转换时的解释 到数据库中存储的日期值。不影响日期数据类型值的显示 存储在数据库或存储格式中。

您可以运行以下语句return当前使用的语言:

SELECT @@LANGUAGE;

这将告诉我们当前的语言是什么以及日期格式(以及其他一些内容):

DBCC USEROPTIONS;

日期格式可通过以下语句修改:

SET LANGUAGE us_english;
SET DATEFORMAT YMD;

这是一篇关于该主题的好文章:How to Change the Current Date Format in SQL Server (T-SQL)

也可以全局修改SQL服务器实例默认语言,一劳永逸:How to change default language for SQL Server?