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. Списък с територии, поддържани от базата данни на Oracle

  2. Oracle 12c ИДЕНТИФИЦИРАН ОТ СТОЙНОСТ

  3. Как да настроите региона на часовата зона за JDBC Connection и да избегнете SqlException регионът на часовата зона не е намерен?

  4. PARTITION BY с и без KEEP в Oracle

  5. Инсталиране на Oracle Forms and Reports 11g Release 2