添加日期时间和时间

11

服务器: 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 The data types datetime and time are incompatible in the add operator.

但是在其他任何数据库中都能工作!有什么想法为什么会发生这种情况吗?

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


1
我找到了这个有用的链接 http://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetime-and-time-are-incompatible-in-the-addsubtract-op.aspx - Ajay
可能是重复的问题:TSQL添加带有时间字段的日期时间字段 - Alex Filipovici
谢谢Ajay提供的信息链接!我只是好奇为什么它必须在2012开发人员版中继续运行。是因为推出时没有完全准备好吗? :-) - tejaslakade
不,向后兼容性不被允许,没有安全的实现。 - Panagiotis Kanavos
3个回答

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)

3
实际上,在将日期和时间相加时,如果您不知道两个值的时区,那么就没有理性的行为。其他数据库可能会假定某些任意默认时区,但SQL Server不会。
如果T-SQL设计人员添加了这样的支持,大多数旧代码(无论是服务器端还是客户端)都会出现难以检测的错误。请记住,大多数人仍然使用旧的datetime类型,假设一些默认时区(本地或GMT)。
您可以认为添加datetimeoffsettime应该是可能的,因为第一个包含时区信息,而第二个则没有,但我认为T-SQL设计人员希望在转换一种数据类型为另一种数据类型时避免混淆。除非人们将其客户端类型更改为时区感知的代码,否则许多客户端代码仍将中断。
那么,为什么没有明确的函数执行此操作?可能也行不通,因为没有时区的datetime类型会被隐式转换为datetimeoffset2。你很容易将没有时区的值传递给这样的函数,它会在传递给函数之前将其转换为错误的时区。
简而言之,向后兼容性无法提供安全的方式来处理日期+时间相加。

0

错误 402 可能会在 数据库兼容性级别 110 或更高时发生:

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;
Msg 402,级别 16,状态 1,行 7
在加法运算符中,数据类型 datetime 和 time 不兼容。

然而,在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以记录它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接