आपको 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
यह ठीक नहीं है कि आप क्या पूछा, के रूप में यह सिर्फ एम.एम. दिखाई नहीं देंगे: डेल्टा < 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
के लिए ऊपर परिणाम में 2 पंक्ति में स्तंभ बदल जाता है।
सब कुछ सेकंड में कनवर्ट करें, इसे समेटें और फिर मैन्युअल रूप से पठनीय प्रारूप में कनवर्ट करें। – Kermit