服务器: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。 - 在企业版中,无论数据库上下文如何,都会引发错误。
答案 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。您可以轻松地将没有时区的值传递给此类函数,并且在传递给函数之前将它转换为错误的时区
简而言之,向后兼容性不能提供处理日期+时间添加的安全方式。