您如何计算 SQL 服务器中每天计划中的任务数?

How do you count number tasks in schedule per day in SQL Server?

我正在尝试在 SQL 服务器中创建一个查询,该查询将 return 计算每天的任务数。如果任务的开始日期和完成日期在同一天,那么它应该只在计数中加一。

这是一个小示例数据集:

+----+------------+-------------+
| ID | Start_Date | Finish_Date |
+----+------------+-------------+
|  1 | 24-Oct-16  | 24-Oct-16   |
|  2 | 24-Oct-16  | 26-Oct-16   |
|  3 | 25-Oct-16  | 26-Oct-16   |
|  4 | 26-Oct-16  | 27-Oct-16   |
|  5 | 26-Oct-16  | 28-Oct-16   |
+----+------------+-------------+

这是预期的结果:

+-----------+----------------+
|   Date    | Count_Of_Tasks |
+-----------+----------------+
| 24-Oct-16 |              2 |   
| 25-Oct-16 |              2 |
| 26-Oct-16 |              4 |
| 27-Oct-16 |              2 |
| 28-Oct-16 |              1 |
+-----------+----------------+

任何人都可以创建一个示例查询来计算每天的任务数吗?

感谢您的帮助!

您需要 calendar table 才能执行此操作

我已经使用 Recursive CTE 即时生成开始日期范围和结束日期范围之间的日期。但是在数据库中创建 Calendar table 总是更好。这将对此类查询非常有帮助

;with data as
(
select * from (
VALUES
    (1, '2016-10-24 00:00:00', '2016-10-24 00:00:00'),
    (2, '2016-10-24 00:00:00', '2016-10-26 00:00:00'),
    (3, '2016-10-25 00:00:00', '2016-10-26 00:00:00'),
    (4, '2016-10-26 00:00:00', '2016-10-27 00:00:00'),
    (5, '2016-10-26 00:00:00', '2016-10-28 00:00:00')) tc ([ID], [Start_Date], [Finish_Date])
),calendar
     AS (SELECT dates = CONVERT(DATETIME, '24-Oct-16') -- Min Start_Date 
         UNION ALL
         SELECT dates = Dateadd(DAY, 1, dates)
         FROM   calendar
         WHERE  dates < '28-Oct-16') -- Max Finish_Date 
SELECT c.dates,
       Count(s.Start_Date) AS Count_Of_Tasks
FROM   calendar c
       LEFT JOIN data s
              ON c.dates between s.Start_Date and s.Finish_Date
Group by c.dates

结果:

╔═════════════════════════╦════════════════╗
║          dates          ║ Count_Of_Tasks ║
╠═════════════════════════╬════════════════╣
║ 2016-10-24 00:00:00.000 ║              2 ║
║ 2016-10-25 00:00:00.000 ║              2 ║
║ 2016-10-26 00:00:00.000 ║              4 ║
║ 2016-10-27 00:00:00.000 ║              2 ║
║ 2016-10-28 00:00:00.000 ║              1 ║
╚═════════════════════════╩════════════════╝

这很棘手。一种方法是分解数据并用 运行 总和重新聚合:

select dte,
       sum(sum(inc)) over (order by dte) as total
from ((select start_date as dte, 1 as inc
       from example
      ) union all
      (select dateadd(day, 1, finish_date), -1 as inc
       from example
      )
     ) e
group by dte
SELECT DISTINCT(startdate),
       (
           SELECT COUNT(*)
           FROM   tasks AS b
           WHERE  a.startdate BETWEEN b.startdate AND b.enddate
       )
FROM   tasks AS a 
UNION
SELECT DISTINCT(enddate),
       (
           SELECT COUNT(*)
           FROM   tasks AS b
           WHERE  a.enddate BETWEEN b.startdate AND b.enddate
       )
FROM   tasks AS a