SQL透视时间表矩阵

SQL透视时间表矩阵,sql,sql-server,Sql,Sql Server,为了深入了解车辆租赁与车辆占用/空置时间之间的关系,我想创建一个用于SSAS多维数据集中的时间矩阵 以下是租赁部分的可用数据: 现在我想把这些数据转为以下结果。显示每小时租车的分钟数 任何关于正确SQL语法的帮助都将非常有用。我认为您可以使用CTE收集24小时的数据,并使用案例来实现预期的结果,如下所示: ;WITH HoursAll(H) AS ( SELECT 0 UNION ALL SELECT H + 1 FROM HoursAll WHERE

为了深入了解车辆租赁与车辆占用/空置时间之间的关系,我想创建一个用于SSAS多维数据集中的时间矩阵

以下是租赁部分的可用数据:

现在我想把这些数据转为以下结果。显示每小时租车的分钟数


任何关于正确SQL语法的帮助都将非常有用。

我认为您可以使用CTE收集24小时的数据,并使用案例来实现预期的结果,如下所示:

;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);

为什么08:00的第一排有5分钟?你能解释一下从开始时间到结束时间应该如何计算分钟数吗?车辆的开始时间是8:55,因此第8小时的前55分钟没有租金。只有8分钟内的最后5分钟是租赁时间。
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