首页 > 解决方案 > 使用日期维度日历减去工作日

问题描述

许多评论建议在 SQL Server 中为工作日和假日计算创建日期表 - 好主意!我找到了一篇很棒的方法文章来在 SQL Server 中创建这样一组表 - https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql -服务器/。如果您需要进行大量日期计算,我强烈推荐这篇文章。

从这些表中,我创建了一个名为 USCalendar 的视图,它计算结束日期,给定开始日期 (03/01/21) 和工作日数 (180) - 完美运行!

select Top 1 TheDate as EndDate
from (
    select Top 180 TheDate from USCalendar
    Where TheDate>='03/01/2021'
    And IsWeekend=0 and IsHoliday=0
    Order By TheDate
) as BusinessDays
Order By TheDate DESC

我唯一的挑战是想出一种方法来扭转它 - 如果我知道目标结束日期和工作日数,我如何找到开始日期?

标签: sqlsql-servertsqldatetime

解决方案


如果您只想要一次约会,您实际上并不需要所有这些。

你可以简单地做

select TheDate as EndDate
from USCalendar
Where TheDate >= '03/01/2021'
  And IsWeekend = 0 and IsHoliday = 0
Order By TheDate
OFFSET 179 ROWS
FETCH NEXT 1 ROW ONLY;

为了扭转这一点,我们将其更改为<=并在另一个方向排序:

select TheDate as EndDate
from USCalendar
Where TheDate <= '03/01/2021'
  And IsWeekend = 0 and IsHoliday = 0
Order By TheDate DESC
OFFSET 179 ROWS
FETCH NEXT 1 ROW ONLY;

我建议您将其设为内联 Table-Valued Function,以便您可以放入任何日期。它基本上变成了参数化视图。它被内联到外部查询中,因此非常有效:

CREATE /* OR ALTER */ FUNCTION dbo.GetBusinessEndDate
( @StartDate date, @numberOfDays int )
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
    select TheDate as EndDate
    from USCalendar
    Where TheDate >= @StartDate
      And IsWeekend = 0 and IsHoliday = 0
    Order By TheDate
    OFFSET @numberOfDays ROWS
    FETCH NEXT 1 ROW ONLY
);

您可以像使用任何其他表格或视图一样使用它,您也可以使用CROSS APPLY它。

我建议为 制作一个单独的函数StartDate,不要尝试将它组合起来。


推荐阅读