2014-11-18 16 views
9

Ich brauche den Zeitunterschied zwischen zwei Mal in Minuten. Ich habe die Startzeit und Endzeit wie unten gezeigt:Berechnen Sie den Zeitunterschied in Minuten in SQL Server

start time | End Time  
11:15:00 | 13:15:00  
10:45:00 | 18:59:00 

ich die Ausgabe für die erste Zeile als 45,60,15 benötigen, die von 11.15 Uhr bis 00.00 Uhr, 12 an die Zinke Differenz entspricht: 00 und 13:00, 13:00 und 13:15 Uhr.

Jeder bitte helfen. Danke im Voraus.

+0

können Sie bitte die Ausgabe, was Sie wollen? – mohan111

+0

Haben Sie schon etwas probiert? – danish

+0

Ich brauche den Ausgang für die erste Zeile der Daten als 45,60,15. Es ist genug, um die Werte als separate Spalten zu drucken. –

Antwort

12

Die folgenden Arbeiten wie erwartet:

SELECT Diff = CASE DATEDIFF(HOUR, StartTime, EndTime) 
        WHEN 0 THEN CAST(DATEDIFF(MINUTE, StartTime, EndTime) AS VARCHAR(10)) 
        ELSE CAST(60 - DATEPART(MINUTE, StartTime) AS VARCHAR(10)) + 
         REPLICATE(',60', DATEDIFF(HOUR, StartTime, EndTime) - 1) + 
         + ',' + CAST(DATEPART(MINUTE, EndTime) AS VARCHAR(10)) 
       END 
FROM (VALUES 
      (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('18:59' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
     ) t (StartTime, EndTime); 

24 Spalten zu erhalten, könnten Sie 24 case-Ausdrücke verwenden, so etwas wie:

SELECT [0] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 0 
         THEN DATEDIFF(MINUTE, StartTime, EndTime) 
        ELSE 60 - DATEPART(MINUTE, StartTime) 
       END, 
     [1] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 1 
         THEN DATEPART(MINUTE, EndTime) 
        WHEN DATEDIFF(HOUR, StartTime, EndTime) > 1 THEN 60 
       END, 
     [2] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 2 
         THEN DATEPART(MINUTE, EndTime) 
        WHEN DATEDIFF(HOUR, StartTime, EndTime) > 2 THEN 60 
       END -- ETC 
FROM (VALUES 
      (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('18:59' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
     ) t (StartTime, EndTime); 

Im Folgenden auch funktioniert, und kürzere kann am Ende die gleiche als Wiederholung über Case-Ausdruck und über:

WITH Numbers (Number) AS 
( SELECT ROW_NUMBER() OVER(ORDER BY t1.N) - 1 
    FROM (VALUES (1), (1), (1), (1), (1), (1)) AS t1 (N) 
      CROSS JOIN (VALUES (1), (1), (1), (1)) AS t2 (N) 
), YourData AS 
( SELECT StartTime, EndTime 
    FROM (VALUES 
       (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
       (CAST('09:45' AS TIME), CAST('18:59' AS TIME)), 
       (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
      ) AS t (StartTime, EndTime) 
), PivotData AS 
( SELECT t.StartTime, 
      t.EndTime, 
      n.Number, 
      MinuteDiff = CASE WHEN n.Number = 0 AND DATEDIFF(HOUR, StartTime, EndTime) = 0 THEN DATEDIFF(MINUTE, StartTime, EndTime) 
           WHEN n.Number = 0 THEN 60 - DATEPART(MINUTE, StartTime) 
           WHEN DATEDIFF(HOUR, t.StartTime, t.EndTime) <= n.Number THEN DATEPART(MINUTE, EndTime) 
           ELSE 60 
          END 
    FROM YourData AS t 
      INNER JOIN Numbers AS n 
       ON n.Number <= DATEDIFF(HOUR, StartTime, EndTime) 
) 
SELECT * 
FROM PivotData AS d 
     PIVOT 
     ( MAX(MinuteDiff) 
      FOR Number IN 
      ( [0], [1], [2], [3], [4], [5], 
       [6], [7], [8], [9], [10], [11], 
       [12], [13], [14], [15], [16], [17], 
       [18], [19], [20], [21], [22], [23] 
      ) 
     ) AS pvt; 

Es funktioniert, indem auf eine Tabelle von 24 Zahlen verbinden, so dass der Fall Ausdruck nicht wiederholt werden muss, dann diese 24 Zahlen rollte zurück in Spalten mit PIVOT

+1

Super !!! Vielen Dank. Angenommen, ich brauche 24 Spalten, und ich brauche den Wert 0, wenn nicht anwendbar, wie kann ich das erreichen? –

+0

Ergebnisse in Null-Fällen in Kanten. Beispiel '23: 55 ', '00: 05' – pkExec

+0

@pkExec Es gab ein kleines Problem mit der PIVOT-Lösung, aber ich denke, dass der Fall "Edge", auf den Sie sich beziehen, kein Randfall ist, es ist nur keins der Die obigen Lösungen sind so konzipiert, dass sie mit einer Startzeit nach der Endzeit umgehen können. – GarethD

22

Verwenden DateDiff mit MINUTE Unterschied:

SELECT DATEDIFF(MINUTE, '11:10:10' , '11:20:00') AS MinuteDiff 

Abfrage, die Ihnen helfen können:

SELECT StartTime, EndTime, DATEDIFF(MINUTE, StartTime , EndTime) AS MinuteDiff 
FROM TableName 
-1

die Sie interessieren ..

select starttime,endtime, case 
    when DATEDIFF(minute,starttime,endtime) < 60 then DATEDIFF(minute,starttime,endtime) 
    when DATEDIFF(minute,starttime,endtime) >= 60 
    then '60,'+ cast((cast(DATEDIFF(minute,starttime,endtime) as int)-60) as nvarchar(50)) 
end from TestTable123416 

Alles was Sie brauchen DateDiff ist ..

Verwandte Themen