【问题标题】:Add datetime and time添加日期时间和时间
【发布时间】:2013-08-26 09:29:17
【问题描述】:

服务器:SQL Server 2012; SP1;开发者版

代码:

declare @datetime datetime = '1900-01-01 00:00:00.000'

declare @time time = '11:11:11'

select @datetime + @time

当我在MASTER 数据库中运行上述代码时,我得到了错误:

Msg 402, Level 16, State 1, Line 3 数据类型 datetime 和 time 在 add 运算符中不兼容。

但是当它是任何其他数据库时,它可以工作! 知道为什么会发生这种情况吗?

附: - 在企业版中,无论数据库上下文如何,这都会引发错误。

【问题讨论】:

标签: sql sql-server-2012


【解决方案1】:

以上代码适用于 MS SqlServer 2008,但此代码不适用于 MS SqlServer 2012 或更高版本。我遇到了同样的问题并像这样解决它。

DECLARE @today_start datetime
DECLARE @dail_time time   

SELECT @today_start = convert(datetime, @dayStr,103) + CAST(@dail_time as DATETIME)

【讨论】:

    【解决方案2】:

    实际上,添加日期和时间并没有合理的行为,除非您知道两个值的时区。其他数据库可能会假设一些任意的默认时区,但 SQL Server 不会。

    如果 T-SQL 设计人员添加了此类支持,大多数旧代码(服务器端和客户端)都会因难以检测到的错误而崩溃。请记住,假设某些默认时区(本地或 GMT),大多数人仍然使用旧的日期时间类型。

    您可能会争辩说添加 datetimeoffsettime 应该是可能的,因为第一个包含时区信息而第二个不包含,但我认为 T- SQL 设计者希望在将一种数据类型转换为另一种时避免混淆。除非人们更改他们的客户端类型时区感知代码,否则许多客户端代码仍然会中断。

    那么,为什么没有明确的函数来做加法呢?可能也不起作用,因为没有时区的日期时间类型会隐式转换为 datetimeoffset2。您可以轻松地将没有时区的值传递给此类函数,并且在将其传递给函数之前,它会被转换为错误的时区

    简而言之,向后兼容性并不能提供一种安全的方式来处理日期+时间相加。

    【讨论】:

      【解决方案3】:

      database compatibility level 110 或更高时可能发生错误 402:

      ALTER DATABASE testdb
      SET COMPATIBILITY_LEVEL = 110;
      GO
      USE testdb;
      DECLARE @datetime DATETIME = '1900-01-01T00:00:00';
      DECLARE @time TIME = '11:11:11';
      SELECT @datetime + @time;
      
      消息 402,第 16 级,状态 1,第 7 行
      数据类型 datetime 和 time 在 add 运算符中不兼容。

      但是,它不会出现在 100 或更低:

      ALTER DATABASE testdb
      SET COMPATIBILITY_LEVEL = 100;
      GO
      USE testdb;
      DECLARE @datetime DATETIME = '1900-01-01T00:00:00';
      DECLARE @time TIME = '11:11:11';
      SELECT @datetime + @time;
      
      1900-01-01 11:11:11.000

      可能您的主数据库的兼容性级别为 110 (SQL Server 2012),而您测试的其他数据库的兼容性级别较低。 (例如,由于使用以前版本的 SQL Server 的备份进行恢复)

      注意:此更改似乎没有记录在案。我已经打开 MicrosoftDocs/sql-docs#7152 来记录它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 2015-09-21
        • 2017-11-17
        • 1970-01-01
        相关资源
        最近更新 更多