当前,我正在尝试以两种不同的方式运行我的sql查询。
WHERE order_date_time >= DateAdd(month,-3,getdate())
和
WHERE DATEDIFF(month,order_date_time,GetDate()) <= 3
1)为什么我得到2种不同的结果?我是否应该获得与尝试查找最近3个月或更短时间内的记录相同的价值?
我在where子句中没有正确计算三个月的差额吗?
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)