2015-10-15 73 views
1

要了解车辆租赁与车辆占用/空闲时间,我想创建一个时间矩阵(用于SSAS立方体中)。SQL枢轴时间表矩阵

下面的租金部分的可用数据:

enter image description here

现在我想这个数据转动到以下结果。显示每小时车辆租赁的分钟数。

enter image description here

在正确的SQL语法来实现这一结果将是巨大的任何帮助。

+0

为什么的第一行时间08:00有5分钟?你能解释一下如何从“starttime”和endtime计算分钟吗? –

+0

车辆启动时间为8点55分,因此在第8小时的第55分钟内没有租金。只有8分钟内的最后5分钟是租赁分钟。 – phicon

回答

3

我认为你可以使用CTE收集24小时,使用CASE实现这样您预期的结果:

;WITH HoursAll(H) AS (
    SELECT 0 
    UNION ALL 
    SELECT H + 1 
    FROM HoursAll 
    WHERE H < 23 
) 
SELECT t.date, t.vehicle, CAST((CAST(ha.H As varchar(10)) + ':00') As time) as [hour] 
    , CASE 
     WHEN ha.H = DATEPART(HOUR,t.starttime) THEN 60 - DATEPART(MINUTE,t.starttime) 
     WHEN ha.H = DATEPART(HOUR,t.endtime) THEN DATEPART(MINUTE,t.endtime) 
     ELSE 60 
    END 
FROM HoursAll ha 
JOIN yourTable t ON ha.H BETWEEN DATEPART(HOUR,t.starttime) AND DATEPART(HOUR,t.endtime); 
0
CREATE FUNCTION [dbo].GetTime (@Start TIME, @End TIME) 
RETURNS @TableTime TABLE(_HH TIME, _MM INT) 
AS 
BEGIN 
    WHILE DATEPART(HH, @Start) <= DATEPART(HH, @End) 
    BEGIN 
     INSERT INTO @TableTime 
     SELECT DATEPART(HH, @Start), 60 
     SET @Start = CAST(DATEADD(HH,1,@Start) AS TIME) 
    END 
    UPDATE @TableTime SET _MM = 60 - DATEPART(MINUTE, @Start) WHERE _HH = DATEPART(HH, @Start) 
    UPDATE @TableTime SET _MM = DATEPART(MINUTE, @End) WHERE _HH = DATEPART(HH, @End) 
END 


SELECT DATE, VEHICLE CROSS APPLY GetTime(Starttime, Endtime) G