文字日期时间为 yyyy-mm-dd 抛出异常

Literal datetimes as yyyy-mm-dd throw an exception

我有一个配置了西班牙语设置的数据库,当我将文字日期时间用作 yyyy-mm-dd 时,出现 varchar 超出范围转换错误。

select convert(datetime, '2014-11-19') 

returns

Msg 242, Level 16, State 3, Line 3 La conversión del tipo de datos varchar en datetime produjo un valor fuera de intervalo.

我必须用西班牙语格式写那些日期时间。这很好用:

select convert(datetime, '2014-11-19') 

我不能同时使用西班牙语和 yyyy-mm-dd 格式吗?。我不想使用西班牙语格式,因为新客户可以使用具有不同区域设置的相同数据库。

我对日期文字没有任何问题,只有日期时间。这适用于西班牙语和 yyyy-mm-dd 格式。

select convert(date, '2014-11-19'), 
       convert(date, '19-11-2014') 

谢谢。

yyyy-MM-dd在SQL服务器中不明确。使用 yyyyMMddyyyy-MM-ddThh:mm:ss.nnnnnnn。如果您不是美国人 SQL 服务器(愚蠢地)将 yyyy-MM-dd 读取为 yyyy-dd-MM 旧数据日期和时间数据类型。根据你的错误,你不是美国人,因此是错误的。

注意:yyyy-MM-dd 对于较新的日期和时间数据类型是明确的。 Microsoft 修复了该“功能”。

或者,您可以向 CONVERT 提供样式代码以指定格式。在这种情况下,这将是样式 23:CONVERT(date time,'2014-11-19',23)

datetime 是 more-or-less 一种遗留类型,这是它的一个怪癖。它处理 yyyy-MM-dd 形式的日期文字的方式受 DATEFORMAT 参数的影响。

真正的解决方案是首先使用日期文字。请改用具有适当类型的参数,在本例中为 date。 当您确实必须使用日期文字时,请使用 yyyyMMdd。避免使用 datetime,而是使用 datedatetime2