sql >> データベース >  >> RDS >> Oracle

Oracle 10gは、日付で5桁の年を受け入れます

    OracleはDATEを格納します ■最初の2バイトが次の7バイトを使用するテーブル内:

    • 世紀+100
    • 世紀の年+100

    したがって、(技術的に)保存できる最大の日付は、これらの2バイトの値が255のときです。 および199 15599の年になります (理論的には255を保存できることを無視しています 2番目のバイトでは、個別の問題のヒープ全体が開かれます。

    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. SQL Serverは、MySQLのON DUPLICATEKEYUPDATEのようなものを提供しますか

    2. 本番環境に対応したデータベース展開に関するDevOpsの考慮事項

    3. BYOCの新機能–クラスターの一時停止と再開

    4. psqlクライアントは今チェス盤になることができます…