我有一份报告,出于各种商业原因计算多个日期差异(以工作日为单位,而不是 DATEDIFF),这些商业原因太乏味了,无法深入讨论。
基本上查询(现在)看起来像这样
SELECT -- some kind of information
DATEDIFF(dd, DateOne, DateTwo) AS d1_d2_diff,
DATEDIFF(dd, DateOne, DateThree) AS d1_d3_diff,
DATEDIFF(dd, DateTwo, DateThree) AS d2_d3_diff,
DATEDIFF(dd, DateTwo, DateFour) AS d2_d4_diff
FROM some_table;
我可以更改此计算以使用标量函数,但我不希望标量函数对结果集中的每一行执行 4 次。
我的数据库中有一个日历表:
CREATE TABLE Calendar (
Date DATETIME NOT NULL,
IsWeekday BIT,
IsHoliday BIT
);
表值函数和 CROSS APPLY 是一个不错的选择吗?如果是这样,我该如何写这样的东西?或者标量函数是我最好的选择吗?
重要说明我们数据库中的所有日期值都已删除时间,因此可以安全地忽略任何将日期重置为午夜的代码。
最佳答案
实际上,我认为您想为此使用标量函数。乍一看,您将需要进行一些计算。然后我又想了想,其实你可以通过两步过程非常简单地做到这一点。
1.) 将日期值回滚到相应日期的午夜,这样您就可以轻松计算出来。由于提供了额外信息,因此不需要这样做!
2.) 执行查询以找出日期值之间存在多少个非假日的工作日
SELECT ISNULL(COUNT(*), 0)
FROM Calendar
WHERE [DATE] > DateOne
AND [DATE] < DateTwo
AND IsWeekDay = 1
AND IsHoliday = 0
总的来说,我认为最有效的方法是将其作为标量函数来执行,我确信可能还有其他方法,但这种方法很简单,并且只要您在日历表上有索引就可以了性能方面应该不会太差。
交叉应用注意事项
稍微看了一下,这也可以通过交叉应用来完成,但实际上最终它做了同样的事情,所以我认为标量函数是一个更好的解决方案,因为它更容易理解,并且很容易可重复。
关于sql - 计算两个日期之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783211/