आपको समय के अंतर को इसके घटक दिन, घंटे, मिनट और दूसरे तत्वों में अलग करना होगा, दिनों की संख्या * 24 को घंटों की संख्या के साथ जोड़ना होगा, और इसे वापस एक साथ रखना होगा।
तिथियों को घटाते समय आपको दिनों की संख्या के रूप में अंतर मिलता है, इसलिए आपको भिन्नात्मक भाग को अन्य तत्वों में बदलने की आवश्यकता होती है, जो आप ट्रंक और मॉड के संयोजन से कर सकते हैं; इसे अनुसरण करने में थोड़ा आसान बनाने के लिए एक सीटीई का उपयोग करना और प्रत्येक मान को स्वयं के साथ-साथ एक ही स्ट्रिंग में जोड़ना:
with y as (
select id, end_time - start_time as runtime
from mytable
)
select id,
runtime,
trunc(runtime) as days,
24 * trunc(runtime) as day_hours,
trunc(24 * mod(runtime, 1)) as hours,
trunc(60 * mod(24 * (runtime), 1)) as minutes,
trunc(60 * mod(24 * 60 * (runtime), 1)) as seconds,
lpad(24 * trunc(runtime)
+ trunc(24 * mod(runtime, 1)), 2, '0')
||':'|| lpad(trunc(60 * mod(24 * (runtime), 1)), 2, '0')
||':'|| lpad(trunc(60 * mod(24 * 60 * (runtime), 1)), 2, '0')
as runtime
from y;
ID RUNTIME DAYS DAY_HOURS HOURS MINUTES SECONDS RUNTIME
---------- ---------- ---------- ---------- ---------- ---------- ---------- --------
1 .184918981 0 0 4 26 16 04:26:16
2 1.14465278 1 24 3 28 18 27:28:18
आप गणना के लिए तिथियों को टाइमस्टैम्प में भी बदल सकते हैं, जो आपको एक अंतराल प्रकार देता है, और फिर extract
का उपयोग करें इसके बजाय तत्व प्राप्त करने के लिए कार्य करें; हालांकि प्रिंसिपल वही है:
with y as (
select id,
cast(end_time as timestamp) - cast (start_time as timestamp) as runtime
from mytable
)
select id,
runtime,
extract (day from runtime) as days,
24 * extract (day from runtime) as day_hours,
extract (hour from runtime) as hours,
extract (minute from runtime) as minutes,
extract (second from runtime) as seconds,
lpad(24 * extract (day from runtime) + extract (hour from runtime), 2, '0')
||':'|| lpad(extract (minute from runtime), 2, '0')
||':'|| lpad(extract (second from runtime), 2, '0')
as runtime
from y;
ID RUNTIME DAYS DAY_HOURS HOURS MINUTES SECONDS RUNTIME
---------- ----------- ---------- ---------- ---------- ---------- ---------- --------
1 0 4:26:17.0 0 0 4 26 17 04:26:17
2 1 3:28:18.0 1 24 3 28 18 27:28:18
या थोड़ा सा बदलाव, तिथियों से अंतर प्राप्त करना और फिर उसे एक अंतराल में परिवर्तित करना:
with y as (
select id,
numtodsinterval(end_time - start_time, 'DAY') as runtime
from mytable
)
...
एसक्यूएल फिडल डेमो।