sql - 使用日期维度日历减去工作日
问题描述
许多评论建议在 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
我唯一的挑战是想出一种方法来扭转它 - 如果我知道目标结束日期和工作日数,我如何找到开始日期?
解决方案
如果您只想要一次约会,您实际上并不需要所有这些。
你可以简单地做
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
,不要尝试将它组合起来。
推荐阅读
- python - Pandas - 创建数据框
- php - 导航到该子类别后禁用子类别文本的呈现 - woocommerce
- r - 如何查看以其中一个值为条件的几列?
- internationalization - hreflang 属性在 ` ` 和 ` `中是否遵循不同的语言代码规则?
- android - 只需一次创建和填充数据 UI - Jetpack Compose 和 MVVM 架构
- python - 数数 从一个数据框列表到另一个数据框列表的匹配词
- python - KeyError: 'sapi5' 使用 pyttsx3 时
- java - 即使将默认默认值分配给变量,也会抛出 NPE 字符串
- javascript - Threejs 场景在我的项目中不起作用/未定义三个
- platformio - 我可以在工作区中有不同的 Arduino/Wemos 项目吗?