ठीक है, मैं आमतौर पर अपने स्वयं के प्रश्नों का उत्तर नहीं देता, लेकिन थोड़ी सी छेड़छाड़ के बाद, मैंने निश्चित रूप से यह पता लगा लिया है कि Oracle DATE घटाव के परिणाम को कैसे संग्रहीत करता है।
जब आप 2 तिथियां घटाते हैं, तो मान NUMBER डेटाटाइप नहीं होता है (जैसा कि Oracle 11.2 SQL संदर्भ मैनुअल आपको विश्वास होगा)। DATE घटाव की आंतरिक डेटाटाइप संख्या 14 है, जो एक गैर-दस्तावेज आंतरिक डेटाटाइप है (NUMBER आंतरिक डेटाटाइप संख्या 2 है)। हालांकि, इसे वास्तव में 2 अलग-अलग दो पूरक हस्ताक्षरित संख्याओं के रूप में संग्रहीत किया जाता है, पहले 4 बाइट्स दिनों की संख्या का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं और अंतिम 4 बाइट्स सेकंड की संख्या का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं।
DATE घटाव का एक उदाहरण जिसके परिणामस्वरूप एक धनात्मक पूर्णांक अंतर होता है:
select date '2009-08-07' - date '2008-08-08' from dual;
इसमें परिणाम:
DATE'2009-08-07'-DATE'2008-08-08'
---------------------------------
364
select dump(date '2009-08-07' - date '2008-08-08') from dual;
DUMP(DATE'2009-08-07'-DATE'2008
-------------------------------
Typ=14 Len=8: 108,1,0,0,0,0,0,0
याद रखें कि परिणाम को 2 अलग-अलग दो के पूरक हस्ताक्षरित 4 बाइट संख्याओं के रूप में दर्शाया गया है। चूंकि इस मामले में कोई दशमलव नहीं है (बिल्कुल 364 दिन और 0 घंटे), अंतिम 4 बाइट्स सभी 0s हैं और इन्हें अनदेखा किया जा सकता है। पहले 4 बाइट्स के लिए, क्योंकि मेरे सीपीयू में थोड़ा-एंडियन आर्किटेक्चर है, बाइट्स उलटे हैं और इसे 1,108 या 0x16c के रूप में पढ़ा जाना चाहिए, जो कि दशमलव 364 है।
DATE घटाव का एक उदाहरण जिसके परिणामस्वरूप एक ऋणात्मक पूर्णांक अंतर होता है:
select date '1000-08-07' - date '2008-08-08' from dual;
इसमें परिणाम:
DATE'1000-08-07'-DATE'2008-08-08'
---------------------------------
-368160
select dump(date '1000-08-07' - date '2008-08-08') from dual;
DUMP(DATE'1000-08-07'-DATE'2008-08-0
------------------------------------
Typ=14 Len=8: 224,97,250,255,0,0,0,0
फिर से, चूंकि मैं एक छोटी-एंडियन मशीन का उपयोग कर रहा हूं, बाइट्स को उलट दिया जाता है और 255,250,97,224 के रूप में पढ़ा जाना चाहिए जो 11111111 11111010 01100001 11011111 से मेल खाती है। अब चूंकि यह दो पूरक हस्ताक्षरित बाइनरी अंक एन्कोडिंग में है, हम जानते हैं कि संख्या है ऋणात्मक क्योंकि बायीं ओर का द्विआधारी अंक 1 है। इसे दशमलव संख्या में बदलने के लिए हमें 2 के पूरक को उलटना होगा (घटाना 1 फिर एक का पूरक करें) जिसके परिणामस्वरूप:00000000 00000101 10011110 00100000 जो संदिग्ध के रूप में -368160 के बराबर है।पी>
DATE घटाव का एक उदाहरण जिसके परिणामस्वरूप दशमलव अंतर होता है:
select to_date('08/AUG/2004 14:00:00', 'DD/MON/YYYY HH24:MI:SS'
- to_date('08/AUG/2004 8:00:00', 'DD/MON/YYYY HH24:MI:SS') from dual;
TO_DATE('08/AUG/200414:00:00','DD/MON/YYYYHH24:MI:SS')-TO_DATE('08/AUG/20048:00:
--------------------------------------------------------------------------------
.25
उन 2 तारीखों के बीच का अंतर 0.25 दिन या 6 घंटे का है।
select dump(to_date('08/AUG/2004 14:00:00', 'DD/MON/YYYY HH24:MI:SS')
- to_date('08/AUG/2004 8:00:00', 'DD/MON/YYYY HH24:MI:SS')) from dual;
DUMP(TO_DATE('08/AUG/200414:00:
-------------------------------
Typ=14 Len=8: 0,0,0,0,96,84,0,0
अब इस बार, चूंकि अंतर 0 दिन और 6 घंटे का है, इसलिए उम्मीद की जाती है कि पहले 4 बाइट्स 0 हैं। अंतिम 4 बाइट्स के लिए, हम उन्हें उल्टा कर सकते हैं (क्योंकि CPU थोड़ा-एंडियन है) और 84,96 =01010100 प्राप्त करें। 01100000 आधार 2 =21600 दशमलव में। 21600 सेकंड को घंटों में बदलने पर आपको 6 घंटे मिलते हैं, जो कि हमारे द्वारा अपेक्षित अंतर है।
आशा है कि इससे किसी को भी मदद मिलेगी जो सोच रहा था कि वास्तव में DATE घटाव कैसे संग्रहीत किया जाता है।