SQL 中 DATEADD() 的真实 return 类型是什么?

What is the REAL return type of DATEADD() in SQL?

SQL中DATEADD()真实return类型是什么? Microsoft 的文档 here says it's a date, their documentation here 说它是 datetime,而 Management Studio 中的 Intellisense 说它是 smalldatetime.

它们之间有相当大的区别,我很惊讶微软在这方面自相矛盾。 date不保存时间信息,smalldatetime保存的时间信息特别不准确;在这两种情况中的任何一种情况下,您都可以忘记诸如尝试跟踪已经过去的毫秒数之类的事情。

我确实尝试了以下实验:

select getdate(), DATEADD(ms, 150, getdate())

可靠地产生如下结果:

2015-01-09 09:54:56.157,    2015-01-09 09:54:56.307

这让我相信这三个记录的案例都不是真的,但它实际上 return 是一个 datetime2 值。顺便说一句,这是在 SQL Server 2012 中。

所以我只是想确认一下:

  1. 真的是datetime2,还是datetime

  2. 这在 SQL 服务器的不同的、相对现代的版本之间是否相当一致(比如,自 2005 年以来)?

  3. 这里还有什么我不太明白的故事吗,或者我什至被什么东西抛弃了?

所以本质上这仍然是一个问题,"What is the real return type?" 但上面的三点说明了我在这个问题上的立场。

编辑

请注意:在第一个 link 上,我主要阅读页面顶部的内容,当我看到 date 和另一个 link 说 datetime,我觉得我不能足够认真地对待这些页面来寻找任何其他陈述的内容。 Aaron Bertrand 澄清了这些文档中使用的 datedate 之间的不同格式,尽管 Microsoft 可能在使用斜体字时犯了一个错误非技术术语。

From MSDN

The return data type is the data type of the date argument, except for string literals. The return data type for a string literal is datetime. An error will be raised if the string literal seconds scale is more than three positions (.nnn) or contains the time zone offset part.

因此,如果第 3 个参数是 DATE 类型之一,它将 return 该类型的结果,例如

select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS DATETIME))
select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS DATETIME2))
select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS SMALLDATETIME))

Returns 3种不同的类型,分别为DateTime, DateTime2 and SmallDateTime