我需要计算所有具有datediff< = 1的订单。我使用COALESCE函数,因为有时Date1可以为null。
SELECT COUNT(*)
FROM Orders
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1
有没有办法只计算工作日(周一至周五)?
感谢。
答案 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