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)
实际上,添加日期和时间时不存在理性行为,除非您知道这两个值的时区。其他数据库可能会假定某个任意的默认时区,但 SQL Server 不会。
如果 T-SQL 设计者添加了这样的支持,大多数旧代码(服务器端和客户端)都会因难以检测的错误而崩溃。请记住,大多数人仍然使用旧的日期时间类型,假设有一些默认时区(本地或 GMT)。
您可能会说添加datetimeoffset和时间应该是可能的,因为第一个包含时区信息而第二个不包含,但我认为 T-SQL 设计者希望在将一种数据类型转换为另一种数据类型时避免混淆。除非人们更改客户端类型的时区感知代码,否则许多客户端代码仍然会损坏。
那么,为什么没有显式函数来执行加法呢?可能也不起作用,因为没有时区的日期时间类型会隐式转换为 datetimeoffset2。您可以轻松地将没有时区的值传递给此类函数,并且在传递给函数之前它将转换为错误的时区
简而言之,向后兼容性不提供处理日期+时间添加的安全方法。