【问题标题】:Literal datetimes as yyyy-mm-dd throw an exception文字日期时间为 yyyy-mm-dd 引发异常
【发布时间】:2020-08-05 10:40:24
【问题描述】:

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

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

返回

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') 

谢谢。

【问题讨论】:

  • 使用 datetime2 格式适用于欧洲日期 - 如果您真的需要在 datetime 中使用它,您可以对其进行双重转换,即 select convert(datetime,(convert(datetime2, '2014-11-19') ))

标签: sql-server sql-server-2017


【解决方案1】:

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

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

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

【讨论】:

  • 添加yyyy-MM-dd 文字在date 的情况下没有歧义;无论DATEFORMAT 设置如何,SELECT CONVERT(date, '2014-11-19') ; 都会返回正确的值。
  • 这就是我在 old 数据类型中提到@DanGuzman 的原因。
  • 谢谢。我将使用 yyyymmdd。
  • @Larnu,我在你最初的回答中没有看到。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2013-10-19
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多