Oracle DATE
स्टोर करता है s 7 बाइट्स का उपयोग करके तालिकाओं में जहाँ पहले 2 बाइट्स हैं:
- सेंचुरी + 100
- शताब्दी का वर्ष + 100
तो अधिकतम तिथि जो (तकनीकी रूप से) संग्रहीत की जा सकती है, जब उन दो बाइट्स का मान 255
है और 199
जो 15599
. का एक वर्ष देगा (मैं इस बात पर ध्यान नहीं दे रहा हूं कि आप सैद्धांतिक रूप से 255
स्टोर कर सकते हैं दूसरे बाइट में, क्योंकि इससे अलग-अलग मुद्दों का एक पूरा ढेर खुल जाता है)।
आप DBMS_STATS.CONVERT_RAW_VALUE
का उपयोग करके अपरिष्कृत मान को दिनांक में बदल सकते हैं जिसका अर्थ है कि हम तिथियां बनाने के सामान्य तरीकों को बायपास कर सकते हैं और सीधे बाइट मान उत्पन्न कर सकते हैं जिन्हें संग्रहीत किया जाएगा।
यह फ़ंक्शन इसका एक उदाहरण है:
CREATE FUNCTION createDate(
year int,
month int,
day int,
hour int,
minute int,
second int
) RETURN DATE DETERMINISTIC
IS
hex CHAR(14);
d DATE;
BEGIN
hex := TO_CHAR( FLOOR( year / 100 ) + 100, 'fm0X' )
|| TO_CHAR( MOD( year, 100 ) + 100, 'fm0X' )
|| TO_CHAR( month, 'fm0X' )
|| TO_CHAR( day, 'fm0X' )
|| TO_CHAR( hour + 1, 'fm0X' )
|| TO_CHAR( minute + 1, 'fm0X' )
|| TO_CHAR( second + 1, 'fm0X' );
DBMS_OUTPUT.PUT_LINE( hex );
DBMS_STATS.CONVERT_RAW_VALUE( HEXTORAW( hex ), d );
RETURN d;
END;
/
फिर यदि आपके पास दिनांक कॉलम है तो आप उन मानों को सम्मिलित कर सकते हैं जिन्हें आपको सामान्य रूप से सम्मिलित करने की अनुमति नहीं है:
CREATE TABLE table_name ( date_column DATE );
INSERT INTO table_name ( date_column )
VALUES ( DATE '2019-12-31' + INTERVAL '1:02:03' HOUR TO SECOND );
INSERT INTO table_name ( date_column ) VALUES ( createDate( 15599, 12, 31, 1, 2, 3 ) );
INSERT INTO table_name ( date_column ) VALUES ( createDate( 12017, 2, 21, 0, 0, 0 ) );
TO_CHAR
जब वर्ष किसी तिथि की सामान्य सीमा से अधिक हो जाता है तो काम नहीं करता है। तालिका में संग्रहीत मान प्राप्त करने के लिए आप DUMP
. का उपयोग कर सकते हैं बाइट मान वाली एक स्ट्रिंग प्राप्त करने के लिए या आप EXTRACT
. का उपयोग कर सकते हैं अलग-अलग घटक प्राप्त करने के लिए।
SELECT DUMP( date_column ),
TO_CHAR( date_column, 'YYYY-MM-DD' ) AS value,
TO_CHAR( EXTRACT( YEAR FROM date_column ), 'fm00000' )
|| '-' || TO_CHAR( EXTRACT( MONTH FROM date_column ), 'fm00' )
|| '-' || TO_CHAR( EXTRACT( DAY FROM date_column ), 'fm00' )
|| ' ' || TO_CHAR( EXTRACT( HOUR FROM CAST( date_column AS TIMESTAMP ) ), 'fm00' )
|| ':' || TO_CHAR( EXTRACT( MINUTE FROM CAST( date_column AS TIMESTAMP ) ), 'fm00' )
|| ':' || TO_CHAR( EXTRACT( SECOND FROM CAST( date_column AS TIMESTAMP ) ), 'fm00' )
AS full_value
FROM table_name;
आउटपुट:
DUMP(DATE_COLUMN) | VALUE | FULL_VALUE :-------------------------------- | :--------- | :------------------- Typ=12 Len=7: 120,119,12,31,2,3,4 | 2019-12-31 | 02019-12-31 01:02:03 Typ=12 Len=7: 255,199,12,31,2,3,4 | 0000-00-00 | 15599-12-31 01:02:03 Typ=12 Len=7: 220,117,2,21,1,1,1 | 0000-00-00 | 12017-02-21 00:00:00
db<>फिडल यहाँ