Sql 从特定日期减去工作日
我需要从特定日期中减去若干个工作日(1-15天),例如从Sql 从特定日期减去工作日,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要从特定日期中减去若干个工作日(1-15天),例如从2013-12-27中减去5个工作日应返回2013-12-20,有没有一种简单的方法可以做到这一点?一种方法是预先创建一个表,其中包含几年前的所有日期,然后从该表中进行选择。这样你可以标记周六、周日、节假日等 DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME SET @StartDate = '2013/10/01' SET @EndDate = '2013/10/31' SEL
2013-12-27
中减去5个工作日应返回2013-12-20
,有没有一种简单的方法可以做到这一点?一种方法是预先创建一个表,其中包含几年前的所有日期,然后从该表中进行选择。这样你可以标记周六、周日、节假日等
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2013/10/01'
SET @EndDate = '2013/10/31'
SELECT
(DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATEPART(dw, @StartDate) = 1 THEN 1 ELSE 0 END)
-(CASE WHEN DATEPART(dw, @EndDate) = 7 THEN 1 ELSE 0 END)
AS [TotalWorkingDays]
结果
TotalWorkingDays
23
重要提示
如果愿意,此方法将只忽略周六和周日
不包括您需要的国定假日和其他季节性假日
使用Zdravko Danev已经提到的日历表
这篇文章解释了如何使用递归CTE进行此操作:
如果有兴趣,我写了一份UDF来回报吉文斯的假期@Sparky哇谢谢分享,你的UDF只考虑美国国定假日吗?是的,尽管你可以修改它来添加任何你想要的假日,只要你知道规则…这实际上是非常酷的方法。我会将日期名称更改为数字(因为不同语言中的名称可能不同)。要减去假期,你可以使用一个表。@ZdravkoDanev发现得很好,我已将其更新为使用DATEPART而不是DateName谢谢@M.Ali,但我要寻找的是有点不同,我需要从一个日期减去天数,而不是从两个日期中减去,但这可能会给我一个开始的想法。根据我的经验,这确实是最好的方法;似乎无论你如何努力地制定一套规则来定义一个“工作日”,企业总是设法想出一些事情来完全搞糟它。您可以尝试自动生成表,或者在年初有一个计划的流程来生成表,但至少让所有数据“硬编码”可以让您有机会修复问题或进行调整。并且查询很容易优化到O(1)。不要太聪明;要实事求是。