2014-11-18 12 views
9

İki kat arasında dakika cinsinden zamana ihtiyacım var.SQL Server'da dakika cinsinden zaman farkını hesaplayın

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

I 11:15 ve 12:00, 12 arasında kaldırma kolu farka karşılık gelir 45,60,15 ilk satırın için çıkış gerekir: aşağıda gösterildiği gibi bir başlangıç ​​zamanı ve bitiş zamanı olan am: Sırasıyla 00 ve 13:00, 13:00 ve 13:15.

Lütfen yardım edin. Şimdiden teşekkürler. DAKİKA farkla

+0

kullanarak sütunlar istediğiniz çıktıyı gönderebilir misiniz? – mohan111

+0

Henüz bir şey denediniz mi? – danish

+0

İlk veri satırı için çıktıya 45,60,15 olarak ihtiyacım var. Değerleri ayrı sütunlar olarak yazdırmak için yeterlidir. –

cevap

12

Aşağıdaki beklendiği gibi çalışır:

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 sütun almak için 24 vaka ifadeleri, gibi bir şey kullanabilirsiniz:

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

aşağıdakiler de çalışır ve aynı tekrarlayarak daha kısa sona erebilir vaka ifadesi defalarca:

içine geri vaka ifadesi daha sonra bu 24 numara haddeleme, tekrarlanması gerekmez böylece, 24 numaralarının tabloya katılarak çalışır
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; 

PIVOT

+1

Awesome !!! Teşekkürler. 24 sütun ihtiyacım varsayalım ve eğer uygun değilse 0 değerini almam gerekiyorsa, bunu nasıl başarabilirim? –

+0

Sonuçlar, kenar durumlarında boşta. örnek '23: 55 ', '00: 05' – pkExec

+0

@pkExec PIVOT çözümünde ufak bir sorun vardı, ama bahsettiğiniz "kenar" durumunun bir kenar durumu olmadığını düşünüyorum; Yukarıdaki çözümler, bitiş zamanından sonraki bir başlangıç ​​zamanı ile başa çıkmak için tasarlanmıştır. – GarethD

22

Kullanım DateDiff:

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

Sorgu size yardımcı olabilir:

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

bu deneyin ..

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 

All You need DateDiff olduğunu ..

İlgili konular