मुझे डर है कि आप एक समाधान के साथ भाग्य से बाहर होने जा रहे हैं जो ओरेकल और एमएसएसक्यूएल दोनों में काम करता है। तिथि अंकगणित कुछ ऐसा है जो डीबीएमएस के विभिन्न स्वादों पर बहुत अलग है।
वैसे भी, Oracle में हम सीधे अंकगणित में तिथियों का उपयोग कर सकते हैं। और हमारे पास एक फ़ंक्शन NUMTODSINTERVAL है जो एक संख्या को एक दिन से दूसरे अंतराल में बदल देता है। तो चलिए उन्हें एक साथ रखते हैं।
साधारण परीक्षण डेटा, दो पंक्तियों के साथ तिथियों के जोड़े लगभग बारह घंटे अलग:
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL> select * from t42
2 /
D1 D2
-------------------- --------------------
27-jul-2010 12:10:26 27-jul-2010 00:00:00
28-jul-2010 12:10:39 28-jul-2010 00:00:00
SQL>
बीता हुआ समय निकालने के लिए सरल SQL क्वेरी:
SQL> select numtodsinterval(sum(d1-d2), 'DAY')
2 from t42
3 /
NUMTODSINTERVAL(SUM(D1-D2),'DAY')
-----------------------------------------------------
+000000001 00:21:04.999999999
SQL>
बस एक दिन से अधिक, जिसकी हम अपेक्षा करेंगे।
TIMESTAMP कॉलम के साथ काम करना थोड़ा अधिक श्रमसाध्य है, लेकिन हम अभी भी उसी ट्रिक पर काम कर सकते हैं।
निम्नलिखित नमूने में। T42T T42 के समान है, केवल कॉलम में उनके डेटाटाइप के लिए DATE के बजाय TIMESTAMP है। क्वेरी DS INTERVAL के विभिन्न घटकों को निकालती है और उन्हें सेकंड में परिवर्तित करती है, जिसे बाद में सारांशित किया जाता है और एक INTERVAL में वापस परिवर्तित किया जाता है:
SQL> select numtodsinterval(
2 sum(
3 extract (day from (t1-t2)) * 86400
4 + extract (hour from (t1-t2)) * 3600
5 + extract (minute from (t1-t2)) * 600
6 + extract (second from (t1-t2))
7 ), 'SECOND')
8 from t42t
9 /
NUMTODSINTERVAL(SUM(EXTRACT(DAYFROM(T1-T2))*86400+EXTRACT(HOURFROM(T1-T2))*
---------------------------------------------------------------------------
+000000001 03:21:05.000000000
SQL>
कम से कम यह परिणाम गोल सेकंड में है!