SQL日期差异工作日

SQL日期差异工作日,sql,sql-server,Sql,Sql Server,我需要计算所有具有datediff的订单,您可以使用一个表并在其中存储所有工作日 或者,您可以使用以下简单公式计算两个日期之间的工作日数。该公式假设周六和周日不是营业日。它假设两个给定日期为工作日 它所做的只是计算正常的天数差异,然后在一周开始的每一天从结果中减去2天(非营业日) 示例1 DECLARE @Date0 date = '2016-04-07'; -- Thursday DECLARE @Date1 date = '2016-04-08'; -- Friday SELECT

我需要计算所有具有datediff的订单,您可以使用一个表并在其中存储所有工作日

或者,您可以使用以下简单公式计算两个日期之间的工作日数。该公式假设周六和周日不是营业日。它假设两个给定日期为工作日

它所做的只是计算正常的天数差异,然后在一周开始的每一天从结果中减去2天(非营业日)


示例1

DECLARE @Date0 date = '2016-04-07'; -- Thursday
DECLARE @Date1 date = '2016-04-08'; -- Friday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;
结果

BusinessDays
1
BusinessDays
1
BusinessDays
6

示例2

DECLARE @Date0 date = '2016-04-08'; -- Friday
DECLARE @Date1 date = '2016-04-11'; -- Monday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;
结果

BusinessDays
1
BusinessDays
1
BusinessDays
6

示例3

DECLARE @Date0 date = '2016-04-08'; -- Friday
DECLARE @Date1 date = '2016-04-18'; -- Monday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;
结果

BusinessDays
1
BusinessDays
1
BusinessDays
6

您的查询如下所示:

SELECT COUNT(*)
FROM Orders
WHERE
    DATEDIFF(day,  COALESCE(Date1, Date2), Date0) -
    DATEDIFF(week, COALESCE(Date1, Date2), Date0) * 2 <= 1
;
选择计数(*)
从命令
哪里
DATEDIFF(日期,合并(日期1,日期2),日期0)-

DATEDIFF(week,COALESCE(Date1,Date2),Date0)*2您可以将计数更改为条件和,使用DATEPART忽略星期六和星期日(dw分别为7和1)

选择SUM(当DATEPART(dw,COALESCE(Date1,Date2))介于2和6之间时的情况)
然后1(其他0结束)
从命令

其中DATEDIFF(dd,COALESCE(Date1,Date2),Date0)定义了工作日。你是说周一到周五,还是不包括圣诞节等公共假日?如果您需要排除圣诞节等,则需要在日历表中定义。对不起,我需要从周一到周五我猜您正在使用SQL Server(请相应地标记)。如果是这样的话,你可以使用
DATENAME
函数计算出一个日期是否在周末,然后对它进行过滤。正如尼克所说,你可以添加一个where子句,只过滤工作日-周一到周五。最简单的方法是“在0和4之间转换(int,COALESCE([OrderDate],[OrderDate2]))%7”,这是一个关于如何计算工作日的示例