Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从特定日期减去工作日_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 从特定日期减去工作日

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

我需要从特定日期中减去若干个工作日(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'


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)。不要太聪明;要实事求是。