SQL中DATEADD()
的真实返回类型是什么? Microsoft的文档here表示它是date
,他们的文档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
这诱使我相信三个记录的案例都不是真的,但它实际上返回datetime2
值。顺便说一句,这是在SQL Server 2012中。
所以我只是想确认一下:
它真的是datetime2
,还是datetime
?
这是不同的,相对现代版本的SQL Server(比如2005年以来)之间的一致性吗?
这里的故事还有什么我不会看到的,或者我甚至被一些东西抛弃了?
所以基本上这仍然是一个问题,仍然是,“真正的返回类型是什么?”但是上面的三点说明了我在这方面的作用。
修改
请注意:在第一个链接上,我主要是在页面顶部阅读,当我看到date
和另一个链接说datetime
时,我感觉不到就像我可以认真对待那些页面来寻找其他任何陈述的东西。 Aaron Bertrand澄清了这些文档中使用的 date 和 date 之间的格式不同,尽管Microsoft在非技术术语中使用斜体时可能会犯错误。 / p>
答案 0 :(得分:3)
返回数据类型是date参数的数据类型,但字符串文字除外。 字符串文字的返回数据类型是datetime。如果字符串文字秒刻度超过三个位置(.nnn)或包含时区偏移部分,则会引发错误。
因此,如果第3个参数是DATE
类型之一,它将返回该类型的结果,例如
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))
分别返回3种不同的类型,即DateTime, DateTime2 and SmallDateTime
。