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

时间:2019-04-04 11:19:39

标签: sql sql-server performance tsql ssms

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

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

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

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

我在where子句中没有正确计算三个月的差额吗?

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

2 个答案:

答案 0 :(得分:4)

DATEDIFF计算2个日期时间之间的“滴答声”数量。因此,例如DATEDIFF(MONTH,'2019-01-31T23:59:59','2019-02-01T00:00:00')返回1,即使仅经过1秒钟;月份已更改(因此发生了一次“滴答”)。

从“更好”的角度看,这取决于您的要求,但是,WHERE DATEDIFF(MONTH,order_date_time,GETDATE()) <= 3在这里不建议使用,因为它是非SARG的。这是因为order_date_time包含在函数DATEDIFF中。

我将使用WHERE order_date_time >= DATEADD(MONTH,-3,GETDATE())(假设您想要在过去三个月中order_date_time所在的行)。

答案 1 :(得分:3)

这些是您的条件:

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

最重要的事情。 。 。这些做不同的事情。第一次可以追溯到三个月。因此,如果今天是4月15日,那么它将花费1月15日之后的所有时间。

第二个查看月边界。因此,它以相同的方式计算一月的所有值,并采用自一月1日以来的所有值。

尽管您应该使用所需的版本,但第一个版本要好得多。基本上,它可以利用索引和分区。函数调用DATEDIFF()使优化器很难使用order_date_time上的索引。

如果您打算使用第二种形式,我建议将其改为这样:

WHERE order_date_time >= datefromparts(year(dateAdd(month, -3, getdate())), month(dateAdd(month, -3, getdate())), 1)