添加日期时间和时间

时间:2013-08-26 09:29:18

标签: 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

当我在MASTER数据库中运行上述代码时,出现错误:

  

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

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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

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

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

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

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

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