将每项工作的日期范围分解为每天的小时数

Break a date range into hours per day for each job

昨天我曾寻求一种有效的方法来将日期范围分解为每天的小时数,并在以下 link...

现在我需要更进一步,为列表中的每个作业生成相同的内容。我有一个包含以下示例信息的 table...

+-------+-------------------------+-------------------------+
| JobID |        StartDate        |         EndDate         |
+-------+-------------------------+-------------------------+
|     1 | 2015-01-27 07:32:35.000 | 2015-01-28 14:39:35.000 |
|     2 | 2015-01-27 07:32:35.000 | 2015-01-29 16:39:35.000 |
|     3 | 2015-03-02 09:46:25.000 | 2015-03-05 17:24:15.000 |
+-------+-------------------------+-------------------------+

我需要得到如下列表...

+-------+------------+-------+
| JobID |    Date    | Hours |
+-------+------------+-------+
|     1 | 2015-01-27 | 16.47 |
|     1 | 2015-01-28 | 14.65 |
|     2 | 2015-01-27 | 16.47 |
|     2 | 2015-01-28 | 24.00 |
|     2 | 2015-01-29 | 16.65 |
|     3 | 2015-03-02 | 14.23 |
|     3 | 2015-03-03 | 24.00 |
|     3 | 2015-03-04 | 24.00 |
|     3 | 2015-03-05 | 17.40 |
+-------+------------+-------+

是否可以修改递归 CTE(来自 link 我包含的)以包含 JobID?

谢谢, 卡尔

这是我想出的解决方案...

DECLARE @testTable TABLE (JobID INT, startdate DATETIME, enddate DATETIME);
INSERT INTO @testTable VALUES (1,'2015-01-27 07:32:35.000','2015-01-28 14:39:35.000');
INSERT INTO @testTable VALUES (2,'2015-01-27 07:32:35.000','2015-01-29 16:39:35.000');
INSERT INTO @testTable VALUES (3,'2015-03-02 09:46:25.000','2015-03-02 17:24:15.000');

WITH cte AS ( 
SELECT JobID,CAST(startdate AS DATE) startdate,DATEDIFF(minute, startdate, DATEADD(DAY, 1, CAST(startdate AS DATE) ) ) / 60.0 hours,enddate from @testTable
UNION ALL 
SELECT JobID,DATEADD(DAY,1, startdate), DATEDIFF(minute, DATEADD(DAY,1, startdate), CASE WHEN DATEADD(DAY,2, startdate) > enddate
    THEN enddate ELSE DATEADD(DAY,2, startdate) END) / 60.0, enddate
FROM cte 
WHERE startdate <> CAST(enddate AS DATE) 
)

SELECT * FROM cte
ORDER BY JobID, startdate