SQL日期差异工作日

时间:2016-04-14 01:44:17

标签: sql sql-server

我需要计算所有具有datediff< = 1的订单。我使用COALESCE函数,因为有时Date1可以为null。

SELECT COUNT(*)
FROM Orders
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1

有没有办法只计算工作日(周一至周五)?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Calendar表并将所有工作日存储在其中。

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

所有这一切,是计算天数的正常差异,然后在每周开始时从此结果中减去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

示例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

示例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
6

您的查询将如下所示:

SELECT COUNT(*)
FROM Orders
WHERE
    DATEDIFF(day,  COALESCE(Date1, Date2), Date0) -
    DATEDIFF(week, COALESCE(Date1, Date2), Date0) * 2 <= 1
;

答案 1 :(得分:1)

您可以将计数更改为条件总和,使用DATEPART忽略星期六和星期日(分别应该有7和1的dw)。

SELECT SUM(CASE WHEN DATEPART(dw, COALESCE(Date1, Date2)) BETWEEN 2 AND 6 
           THEN 1 ELSE 0 END)
FROM Orders
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1