如果日期更接近,DateDiff(或.NET中的减法日期)会执行得更快吗?

如果日期更接近,DateDiff(或.NET中的减法日期)会执行得更快吗?,.net,sql,date,.net,Sql,Date,想法: 我想在.NET中,日期的基础数学是用记号完成的。如果是这样的话,我认为在确定两个日期之间的差异时,两个日期之间的距离无关紧要。您只需减去刻度,然后进行一系列除法,将结果从刻度转换为天。我看不出两次更近的约会会如何加快速度,或者进一步的约会会如何减慢速度。我错过什么了吗 在SQL方面……我不知道。我想这是相似的,但我没有证据 示例/上下文: 假设我有一个函数,如果给定开始日期、结束日期和时间段(本例中以天为单位),它将告诉我该时间段在给定的日期范围内可以出现多少次 somefunction

想法:

我想在.NET中,日期的基础数学是用记号完成的。如果是这样的话,我认为在确定两个日期之间的差异时,两个日期之间的距离无关紧要。您只需减去刻度,然后进行一系列除法,将结果从刻度转换为天。我看不出两次更近的约会会如何加快速度,或者进一步的约会会如何减慢速度。我错过什么了吗

在SQL方面……我不知道。我想这是相似的,但我没有证据

示例/上下文:

假设我有一个函数,如果给定开始日期、结束日期和时间段(本例中以天为单位),它将告诉我该时间段在给定的日期范围内可以出现多少次

somefunction(<first of this year>, <first of last year>, <30 days>)
//returns 12
somefunction(,)
//返回12
实现此功能的一种(不好的)方法是从开始日期开始,然后继续添加时间段(例如30天),并检查是否已超过结束日期。然而,你的约会范围越广,这就越慢

另一种方法是计算日期范围内的天数,然后除以时间段内的天数。在.NET中,您可以减去开始日期和结束日期,然后返回
TimeSpan
。在SQL中,您可以使用
DateDiff
函数来做同样的事情

我的问题是,这些其他方法是否会遇到与第一种方法相同的问题。具体地说:计算两个接近的日期之间的差值是更快还是根本没有差别?

编辑:我为什么问这个问题?

我在寻找两次约会的差异方面的表现真的是我遇到的问题吗


是(带星号)。在我们的一个应用程序中,计算耗时0.3秒(通常需要进行30次左右)。用户并不那么兴奋,所以我试着看看我们可以在哪里加快速度。我将问题追溯到一个函数,该函数的目的是查找两个日期之间的差异。它不是简单地减去它们,而是迭代开始和结束之间的所有日期,并保持一个连续的总数……真的。在将函数切换到仅使用减法(以及SQL中的日期差(数据库中有类似的代码))时,我看到每天晚上都有一些进程运行,以生成一个更接近今天的数字供计算使用。我问这个问题是为了看看继续让这些进程运行,并使用它们生成的值,还是只使用原始的开始日期,是否有任何价值。我现在觉得让这些过程停止很舒服。谢谢大家的回答。

它对所有当前编程语言、运行时/平台和数据库引擎(无论什么合适)都没有任何区别。

它对所有当前编程语言、运行时/平台和数据库引擎(无论什么合适)都没有区别

任何合理的平台都会将时间表示为自某个时代以来的一定数量的单位。在这种情况下,日期差仅仅是减法。因此,此操作的性能与操作数之间的距离无关。这对于CLR和SQL Server来说是正确的


为什么这很重要

任何合理的平台都将时间表示为自某个时代以来的一定数量的单位。在这种情况下,日期差仅仅是减法。因此,此操作的性能与操作数之间的距离无关。这对于CLR和SQL Server来说是正确的


为什么这很重要

回答一般问题

对于非统一的时间段,例如月份,可能会涉及一定数量的猜测。在本文中,我们通过(比如)将持续时间(以滴答为单位)除以“每月平均滴答数”来获得“合理猜测”,然后使用代码的其余部分来尝试该猜测,看看它是否正确。如果不是,我们调整猜测并重试

现在,随着时间的推移,这些猜测可能会逐渐变得不准确——因为“每月平均滴答数”可能并不准确。然而,我怀疑它必须经过一段非常长的时间才能产生显著的变化。更可能的情况是,由于月份的边界条件(例如,长月份的错误一侧),猜测将被排除一到两次,这种情况可能发生在任何地方

还请注意,一些日历系统比其他日历系统更易于优化,其中一些日历系统可能会受到所讨论日期的影响。例如,如果你有一个分割的儒略/公历和一个分割点,我可以很容易地想象,计算跨越分割点的两个日期之间的周期比计算完全位于一边或另一边的周期要长

基本上,日历系统是复杂的——最好不要假设“它应该只是一个XYZ的问题……”,因为这几乎注定是错误的:)

回答具体问题


是的,您的第二种方法听起来确实应该比第一种方法在长时间段内快得多,而且即使存在长时间段和短时间段内计算速度的任何差异,也不太可能造成如此大的差异;我怀疑您是否能看到它,尽管它当然仍然值得测试。

回答一般问题

对于非统一的时间段,例如月份,可能会涉及一定数量的猜测。在本文中,我们通过(比如)将持续时间(单位为滴答声)除以“每月平均滴答声数”来进行一些计算,然后使用代码的其余部分尝试该猜测,看看它是否正确