sql >> Databáze >  >> RDS >> Oracle

Oracle 10g přijímá 5místný rok v datu

Oracle ukládá DATE s v tabulkách používajících 7 bajtů, kde první 2 bajty jsou:

  • Století + 100
  • Rok století + 100

Maximální datum, které lze (technicky) uložit, je, když tyto dva bajty mají hodnoty 255 a 199 což by dalo rok 15599 (Ignoruji, že byste teoreticky mohli uložit 255 ve druhém bajtu, protože to otevírá celou hromadu samostatných problémů).

Nezpracovanou hodnotu můžete převést na datum pomocí DBMS_STATS.CONVERT_RAW_VALUE což znamená, že můžeme obejít běžné metody vytváření dat a přímo generovat bajtové hodnoty, které budou uloženy.

Tato funkce je toho příkladem:

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;
/

Pak, pokud máte sloupec data, můžete vkládat hodnoty, které normálně vkládat nesmíte:

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 nefunguje, když rok přesahuje normální hranice data. Chcete-li získat hodnoty uložené v tabulce, můžete použít DUMP Chcete-li získat řetězec obsahující hodnoty bajtů, nebo můžete použít EXTRACT získat jednotlivé komponenty.

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;

výstupy:

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<>zde hrajte




  1. Jak používat model strojového učení KNN s 2UDA – PostgreSQL a Orange (část 1)

  2. Jak se dotazovat na hodnoty a atributy Xml z tabulky na serveru SQL?

  3. Jak zaokrouhlit průměr na 2 desetinná místa v PostgreSQL?

  4. Získejte základní sloupce zobrazení na základě sady výsledků