为什么 DateAdd() 和 DATEDIFF() 给出不同的结果,哪个性能更好?

kum*_*uml 3 sql t-sql sql-server performance ssms

目前,我正在尝试以两种不同的方式运行我的 sql 查询。

WHERE order_date_time >= DateAdd(month,-3,getdate())

WHERE DATEDIFF(month,order_date_time,GetDate()) <= 3

1)为什么我得到两个不同的结果?我是否应该获得与尝试查找过去 3 个月或更短时间的记录相同的值?

我在 where 子句中是否没有正确计算 3 个月的差异?

2)哪个函数在性能方面更好并且返回结果更快?

use*_*983 6

DATEDIFF计算 2 个日期时间之间的“刻度”数。因此,例如DATEDIFF(MONTH,'2019-01-31T23:59:59','2019-02-01T00:00:00')return 1,即使只过去了 1 秒;月份已更改(因此发生了一个“勾号”)。

对于什么是“更好”的观点,这取决于您的要求,但是,WHERE DATEDIFF(MONTH,order_date_time,GETDATE()) <= 3这里不建议这样做,因为它是不可SARGable的。这是因为order_date_time包含在函数内DATEDIFF

我会使用WHERE order_date_time >= DATEADD(MONTH,-3,GETDATE())(假设您想要过去order_date_time3 个月内的行)。