sql - 计算两个日期之间的差异

标签 sql sql-server database

我有一份报告,出于各种商业原因计算多个日期差异(以工作日为单位,而不是 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/

相关文章:

sql-server - 如何在sql查询中获取连续记录条目的最大值?

c# - LINQ 查询 if 条件外部参数

android - 在 Sqlite 数据库中保存 webview geturl 和 getitle。语法错误撇号 ' 的问题

c# - 在以下案例实例中,我应该使我的 SQL 查询异步吗?

mysql - 如何在SQL中选择仅一个字段和所有其他字段重复的记录?

sql - 如何在数据库中检查空标题?

php - MySQL REGEXP 仅匹配边界词,但不包括 html 标签中的匹配

sql-server - 在 SQL Server 2008 R2 中开始调试时发生错误,错误 HRESULT E_FAIL 已从对 COM 组件的调用返回。 (mscorlib)

database - 操作错误 : stack depth limit exceeded

mysql - 如何从数据库中选择汽车已停止的位置?