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

Sql 为什么DateAdd()和DATEDIFF()会给出不同的结果,哪一个性能更好?,sql,sql-server,performance,tsql,ssms,Sql,Sql Server,Performance,Tsql,Ssms,目前,我正在尝试以两种不同的方式运行sql查询 其中订单日期时间>=DateAddmonth,-3,getdate 及 其中DATEDIFFmonth、order\u date\u time、GetDate这些是您的条件: WHERE order_date_time >= DateAdd(month, -3, getdate()) WHERE DATEDIFF(month, order_date_time, GetDate()) <= 3 以下是您的条件: WHERE order_

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

其中订单日期时间>=DateAddmonth,-3,getdate


其中DATEDIFFmonth、order\u date\u time、GetDate这些是您的条件:

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

以下是您的条件:

WHERE order_date_time >= DateAdd(month, -3, getdate())
WHERE DATEDIFF(month, order_date_time, GetDate()) <= 3
DATEDIFF统计两个datetimes之间的刻度数。因此,例如DATEDIFFMONTH,'2019-01-31T23:59:59','2019-02-01T00:00:00'返回1,即使只过了1秒;月份已更改,因此出现了一个勾号

但是,从更好的角度来看,这取决于您的需求,其中DATEDIFFMONTH、order_date_time、GETDATEDATEDIFF统计2个datetimes之间的刻度数。因此,例如DATEDIFFMONTH,'2019-01-31T23:59:59','2019-02-01T00:00:00'返回1,即使只过了1秒;月份已更改,因此出现了一个勾号


从更好的角度来看,这取决于您的要求,但是,WHERE DATEDIFFMONTH、order_date_time、GETDATE与数据共享,您在其中获得不同的结果与数据共享,您在其中获得不同的结果我@Larnu感谢您的回答。一个问题-在这种情况下,你所说的记号是什么意思?你是说吵架吗?那么,什么是不可销售的?另外,在我上面的两个where子句中,两者都在计算3个月的差额,还是我做错了什么?他指的是变化的时刻,时间边界,诸如此类的事情。从上个月值到下个月值的更改次数。这就是datediff的计算结果。@kuml实际上,他们并不是都在计算3个月的差异。DATEDIFF提供的行的月份本身为3个月或更短。因此,从2019年4月30日开始,日期为1月1日至4月30日(包括1月1日至4月30日)。另一种是日期大于或等于3个月前的日期;因此,再次使用相同的数据将是1月30日至4月30日(含1月30日)。这是不一样的。我所说的勾号是指值已更改,边界已过。在本例中,传递了月份边界。萨根;e表示可搜索参数,非可搜索查询不能在表上使用索引。谢谢@Lernu回答我的问题-非常有用的信息hi@Larnu谢谢你的回答。一个问题-在这种情况下,你所说的记号是什么意思?你是说吵架吗?那么,什么是不可销售的?另外,在我上面的两个where子句中,两者都在计算3个月的差额,还是我做错了什么?他指的是变化的时刻,时间边界,诸如此类的事情。从上个月值到下个月值的更改次数。这就是datediff的计算结果。@kuml实际上,他们并不是都在计算3个月的差异。DATEDIFF提供的行的月份本身为3个月或更短。因此,从2019年4月30日开始,日期为1月1日至4月30日(包括1月1日至4月30日)。另一种是日期大于或等于3个月前的日期;因此,再次使用相同的数据将是1月30日至4月30日(含1月30日)。这是不一样的。我所说的勾号是指值已更改,边界已过。在本例中,传递了月份边界。萨根;e表示可搜索的参数,非可搜索的查询不能在表上使用索引。谢谢@Lernu回答我的问题-非常有用的信息为什么问号不可能?戈登?当函数应用于数据时,索引不起作用,这难道不是一个已知的事实吗?我到处都读过……可能包括你的帖子。@GeorgeMenoutis你的答案有助于理解两者的区别。我现在明白了,DateAddmonth,-3,getdate将始终是从今天算起的精确3个月的相对周期。这正是我所需要的,因为我需要能够在下个月运行此查询,所以应该计算从该日期算起的3个月,同时我看到datediff如何计算月份,而不考虑今天的日期date@GeorgeMenoutis . . . 有两个原因。首先,索引与CAST一起使用,并且据我所知,将一个索引转换为最新的索引。第二,如果对函数有所了解,它实际上应该是可能的。然而,我不知道有任何数据库实现了这种逻辑。为什么问号不可能?戈登?当函数应用于数据时,索引不起作用,这难道不是一个已知的事实吗?我到处都读过……可能包括你的帖子。@GeorgeMenoutis你的答案有助于理解两者的区别。我现在明白了,DateAddmonth,-3,getdate将始终是从今天算起的精确3个月的相对周期。这正是我所需要的,因为我需要能够在下个月运行此查询,所以应该计算从该日期算起的3个月,同时我看到datediff如何计算月份,而不考虑今天的日期date@GeorgeMenoutis . . . 有两个原因。首先,索引与CAST一起使用,并且据我所知,将一个索引转换为最新的索引。第二,如果对函数有所了解,它实际上应该是可能的。我不知道有什么问题 然而,实现该逻辑的y数据库。