Как хранятся даты в Oracle?
Как хранятся даты в Oracle? Например, я знаю, что большинство систем используют время Epoch для определения времени. Вычислив, сколько секунд осталось с 1 января 1970 года. Делает ли это Oracle тоже?
Причина, по которой я спрашиваю об этом, я заметил, что если вы берете две даты в Oracle и вычитаете их, вы получаете с плавающей точкой количество дней между ними.
Пример
(Sysdate - dateColumn)
вернет что-то вроде этого (в зависимости от времени)
3.32453703703703703703703703703703703704
Теперь Oracle делает преобразование и выплескивание этого формата, или Oracle хранит даты с тем, сколько дней он находится за пределами определенного периода времени? (Как время Epoch)
Ответы
Ответ 1
Есть два типа 12 и 13
http://oraclesniplets.tumblr.com/post/1179958393/my-oracle-support-oracle-database-69028-1
Введите 13
select dump(sysdate) from dual;
Typ=13 Len=8: 220,7,11,26,16,41,9,0
The format of the date datatype is
Byte 1 - Base 256 year modifier : 220
2 - Base 256 year : 256 * 7 = 1792 + 220 = 2012
3 - Month : 11
4 - Day : 26
5 - Hours : 16
6 - Minutes : 41
7 - Seconds : 09
8 - Unused
26-11-2012 16:41:09
Введите 12
select dump(begindate) from tab;
Typ=12 Len=7: 100,112,2,7,1,1,1
The format of the date datatype is
byte 1 - century (excess 100) 100 - 100 = 00
byte 2 - year (excess 100) 112 - 100 = 12
byte 3 - month = 2
byte 4 - day = 7
byte 5 - hour (excess 1) 1 - 1 = 0
byte 6 - minute (excess 1) 1 - 1 = 0
byte 7 - seconds (excess 1) 1 - 1 = 0
0012-02-07 00:00:00
Ответ 2
Из руководства в http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151
Для каждого значения DATE Oracle хранит следующую информацию: год, месяц, день, час, минута и секунда
Таким образом, очевидно, что он не сохраняет значение эпохи, которое также подтверждено этой главой руководства:
База данных хранит даты в виде чисел. Даты хранятся в полях фиксированной длины по 7 байт каждый, что соответствует векам, годам, месяцам, дням, часам, минутам и секундам
Ответ 3
Как хранятся даты в Oracle?
два типа данных 12
и 13
предназначены для двух разных целей.
- Тип 12 - Даты, хранящиеся в таблице
- Тип 13. Дата, возвращаемая функциями внутренней даты, такими как
SYSDATE
/CURRENT_DATE
, также при преобразовании строкового литерала в дату с использованием TO_DATE
или ANSI Date literal DATE 'YYYY-MM-DD'
.
Тестовые случаи:
Настройка базовой таблицы для типа 12:
SQL> CREATE TABLE t(col DATE);
Table created.
SQL> INSERT INTO t SELECT SYSDATE FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
Проверьте различные случаи:
SQL> SELECT DUMP(col) FROM t;
DUMP(COL)
--------------------------------------------------------------------------------
Typ=12 Len=7: 120,116,3,17,18,6,55
SQL> SELECT DUMP(SYSDATE) FROM dual;
DUMP(SYSDATE)
--------------------------------------------------------------------------------
Typ=13 Len=8: 224,7,3,17,17,5,54,0
SQL> SELECT DUMP(CURRENT_DATE) FROM dual;
DUMP(CURRENT_DATE)
--------------------------------------------------------------------------------
Typ=13 Len=8: 224,7,3,17,17,14,20,0
SQL> SELECT DUMP(TO_DATE('17-DEC-1980 12:12:12','DD-MON-YYYY HH24:MI:SS')) FROM dual;
DUMP(TO_DATE('17-DEC-198012:12:12','
------------------------------------
Typ=13 Len=8: 188,7,12,17,12,12,12,0
Использование ANSI Date literal, как TO_DATE:
SQL> SELECT DUMP(DATE '2016-03-17') FROM dual;
DUMP(DATE'2016-03-17')
--------------------------------
Typ=13 Len=8: 224,7,3,17,0,0,0,0
SQL> INSERT INTO t SELECT to_date('17-DEC-1980 12:13:14','DD-MON-YYYY HH24:MI:SS') FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT DUMP(col) FROM t;
DUMP(COL)
--------------------------------------------------------------------------------
Typ=12 Len=7: 120,116,3,17,18,6,55
Typ=12 Len=7: 119,180,12,17,13,14,15
SQL>
Как вы можете видеть, сохраняя дату в таблице, она использует тип 12. Второй тип 13 используется при преобразовании строкового литерала в дату с использованием функций даты или когда дата возвращается с помощью функций внутренней даты, таких как SYSDATE
/CURRENT_DATE
.