添加日期时间和时间

tej*_*ade 11 sql sql-server-2012

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

码:

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

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

select @datetime + @time
Run Code Online (Sandbox Code Playgroud)

当我在MASTER数据库中运行上面的代码时,我收到错误:

消息402,级别16,状态1,行3数据类型日期时间和时间在添加运算符中不兼容.

但是当它是任何其他数据库时,它的工作原理!知道为什么会这样吗?

PS - 在企业版中,无论数据库上下文如何,都会引发错误.

小智 5

上面的代码适用于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)
Run Code Online (Sandbox Code Playgroud)


Pan*_*vos 3

实际上,添加日期和时间时不存在理性行为,除非您知道这两个值的时区。其他数据库可能会假定某个任意的默认时区,但 SQL Server 不会。

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

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

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

简而言之,向后兼容性不提供处理日期+时间添加的安全方法。