जब आप दो DATE
घटाते हैं enddate - startdate
. जैसे मान आपको दशमलव सटीकता के साथ दिनों में अंतर मिलता है, इसलिए उदाहरण के लिए 1.5 का अर्थ 1 1/2 दिन या 36 घंटे होगा। आप इसे HH:MI:SS
. में बदल सकते हैं बहुत सारे गणित का उपयोग करते हुए, लेकिन एक आसान तरीका यह है कि दशमलव मान को INTERVAL DAY TO SECOND
में बदल दिया जाए। NUMTODSINTERVAL
का उपयोग करके मान
समारोह:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
आपको लगता है कि TO_CHAR
फ़ंक्शन इसे HH:MI:SS
. के रूप में प्रारूपित करने में सक्षम होगा , लेकिन यह उस तरह से काम नहीं कर रहा है। आप EXTRACT
. का उपयोग कर सकते हैं इसके बजाय, और TO_CHAR
यह सुनिश्चित करने के लिए कि आपको अग्रणी शून्य मिले:
TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
00
प्रारूप कोड का हिस्सा दो अंकों को निर्दिष्ट करता है, यदि आवश्यक हो तो एक अग्रणी शून्य के साथ। FM
भाग स्वरूपित परिणाम में अग्रणी स्थान से छुटकारा पाता है, जो कि यदि आवश्यक हो तो एक नकारात्मक संकेत के लिए आरक्षित है।
यह भी ध्यान दें कि आपकी क्वेरी को समग्र मान मिलते हैं और उनका उपयोग उसी SELECT
. में किया जाता है सूची। Oracle आपको ऐसा नहीं करने देगा। इसके बजाय कुछ इस तरह का प्रयास करें:
WITH StartEndByID AS (
SELECT
msglog.id,
NUMTODSINTERVAL(max(msglog.timestamp) - min(msglog.timestamp), 'DAY') elapsed
FROM messagelog msglog
GROUP BY id
)
SELECT
id,
TO_CHAR(EXTRACT(HOUR FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(MINUTE FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(SECOND FROM elapsed), 'FM00') AS ElapsedHHMISS
FROM StartEndByID