Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

HH:MM:SS प्रारूप में DatedIFF

आपको 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2008 info_schema.columns को अनुमति देता है

  2. संदेश 8672, स्तर 16, राज्य 1, पंक्ति 1 MERGE कथन ने एक ही पंक्ति को एक से अधिक बार अद्यतन या हटाने का प्रयास किया

  3. SQL सर्वर में एक स्ट्रिंग में प्रत्येक शब्द के पहले अक्षर को कैपिटलाइज़ करने का सबसे अच्छा तरीका क्या है

  4. SQL सर्वर त्रुटि प्रबंधन:अपवाद और डेटाबेस-क्लाइंट अनुबंध

  5. SQL XML मान लाने के लिए XPath