आपको time
. में परिवर्तित नहीं होना चाहिए - यह एक 24 घंटे की घड़ी पर एक समय में एक बिंदु को स्टोर करने के लिए है, न कि एक अवधि या अंतराल (यहां तक कि एक जो अपने आप में <24 घंटे के लिए विवश है, जो स्पष्ट रूप से आपका डेटा नहीं है)। इसके बजाय आप डेटीफ को आवश्यक न्यूनतम अंतराल (आपके मामले में, सेकंड) में ले सकते हैं, और फिर कुछ गणित और स्ट्रिंग मैनिपुलेशन कर सकते हैं ताकि इसे आपको आवश्यक आउटपुट प्रारूप में प्रस्तुत किया जा सके (यह सेकंड को एप्लिकेशन में वापस करने के लिए भी बेहतर हो सकता है या रिपोर्ट टूल और इसे यह काम करने के लिए कहें।
DECLARE @d TABLE
(
id INT IDENTITY(1,1),
StartDateTime DATETIME,
EndDateTime DATETIME
);
INSERT @d(StartDateTime, EndDateTime) VALUES
(DATEADD(DAY, -2, GETDATE()), DATEADD(MINUTE, 15, GETDATE())),
(GETDATE() , DATEADD(MINUTE, 22, GETDATE())),
(DATEADD(DAY, -1, GETDATE()), DATEADD(MINUTE, 5, GETDATE())),
(DATEADD(DAY, -4, GETDATE()), DATEADD(SECOND, 14, GETDATE()));
;WITH x AS (SELECT id, StartDateTime, EndDateTime,
d = DATEDIFF(SECOND, StartDateTime, EndDateTime),
a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER()
FROM @d
)
SELECT id, StartDateTime, EndDateTime,
[delta_HH:MM:SS] = CONVERT(VARCHAR(5), d/60/60)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2),
[avg_HH:MM:SS] = CONVERT(VARCHAR(5), a/60/60)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)
FROM x;
परिणाम:
id StartDateTime EndDateTime delta_HH:MM:SS avg_HH:MM:SS
-- ------------------- ------------------- -------------- ------------
1 2013-01-19 14:24:46 2013-01-21 14:39:46 48:15:00 42:10:33
2 2013-01-21 14:24:46 2013-01-21 14:46:46 0:22:00 42:10:33
3 2013-01-20 14:24:46 2013-01-21 14:29:46 24:05:00 42:10:33
4 2013-01-17 14:24:46 2013-01-21 14:25:00 96:00:14 42:10:33
यह ठीक वैसा नहीं है जैसा आपने पूछा था, क्योंकि यह डेल्टा के लिए केवल MM:SS नहीं दिखाएगा <1 घंटा। आप इसे एक साधारण CASE
. के साथ समायोजित कर सकते हैं अभिव्यक्ति:
;WITH x AS (SELECT id, StartDateTime, EndDateTime,
d = DATEDIFF(SECOND, StartDateTime, EndDateTime),
a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER()
FROM @d
)
SELECT id, StartDateTime, EndDateTime,
[delta_HH:MM:SS] = CASE WHEN d >= 3600 THEN
CONVERT(VARCHAR(5), d/60/60) + ':' ELSE '' END
+ RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2),
[avg_HH:MM:SS] = CASE WHEN a >= 3600 THEN
CONVERT(VARCHAR(5), a/60/60) + ':' ELSE '' END
+ RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)
FROM x;
यह क्वेरी उपरोक्त परिणाम में दूसरी पंक्ति में डेल्टा कॉलम को 0:22:00
. से बदल देती है से 22:00
।