Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle 10g एक तिथि में 5 अंकों का वर्ष स्वीकार करता है

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<>फिडल यहाँ




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. खाली तालिका के MAX () को NULL के बजाय 0 के रूप में कैसे व्यवहार करें?

  2. यदि पासवर्ड में विशेष वर्ण हैं तो JDBC का उपयोग करके Oracle डेटाबेस से कनेक्ट करने में सक्षम नहीं है

  3. लॉन्ग को Varchar2 में कनवर्ट करना

  4. पिछले महीने या वर्ष के गुम डेटा को संचयी रूप से जोड़ें

  5. Oracle डेटाबेस में PL/SQL ब्लॉक सदस्य के रूप में VARRAYs कैसे बनाएं?