GETUTCDATE()-2与DATEADD(d,-2,GETUTCDATE())


13

我想知道以下两种方法之间的区别是什么:

 GETUTCDATE()-2  

  DATEADD(d,-2,GETUTCDATE())

我想使用DATEADD是正确的方法,但是想知道为什么吗?

Answers:


14

那里并没有真正的区别,但是当您开始使用DATETIME2值或返回DATETIME2值的函数时,会出现错误。

SELECT SYSDATETIME() - 1 AS [Incompatible]

消息206,级别16,状态2,第17行操作数类型冲突:datetime2与int不兼容

对于这些,您必须使用日期数学函数。

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

亚伦·伯特兰(Aaron Bertrand)在他的《踢烂习惯》系列中简要谈到了这个问题。


8

与其他答案之一相反,SQL Server 正式支持并记录了这两个选项:datetime - number不是未定义的行为。

的最大优势

DATEADD(d, -2, GETUTCDATE())

它是自我记录的事实:目的是显而易见的。

GETUTCDATE() - 2另一方面,依赖于读者了解datetime - number操作的定义。是的,它当前可能是惯用的T-SQL,但是不再受此支持的事实datetime2意味着,下一代的SQL Server开发人员可能不再对此熟悉。


它更明确地说在这里:算术运算符(Transact-SQL)加号(+)和减号( - ),运营商还可以用于执行算术运算的datetimesmalldatetime的值。
ypercubeᵀᴹ

@ypercubeᵀᴹ:-(减法)(Transact-SQL)的第一行对于单位(天)更加明确:“减去两个数字(算术减法运算符)。还可以从日期中减去一个以天为单位的数字。 。
Heinzi

是的,我看到了。然后,后来出现“不能与日期,时间,datetime2或datetimeoffset数据类型一起使用”。因此,第一句中的“日期”表示除禁止的日期/时间类型外的任何日期/时间类型(因此只有datetime和smalldatetime,基本上是在添加2008(?)版本之前存在的datetime类型date)。有点乱。
ypercubeᵀᴹ

也许这是您可以在答案中添加的另一件事。该运算符不支持新类型的事实表明,仅出于向后兼容的原因保留了该运算符。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.