Jak daty przechowywane w Oracle?
W dwa rodzaje danych12
i 13
są dwa różne cele.
- Type 12 - Terminy zapisane w tabeli
- Type 13 - Data zwrócony przez wewnętrzne funkcji daty jak
SYSDATE
/CURRENT_DATE
, także podczas konwertowania ciąg dosłowny w terminie za pomocą TO_DATE
lub ANSI Data dosłownegoDATE 'YYYY-MM-DD'
.
przypadki testowe:
Podstawowa konfiguracja stół dla typ 12:
SQL> CREATE TABLE t(col DATE);
Table created.
SQL> INSERT INTO t SELECT SYSDATE FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
Sprawdź różne przypadki:
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
Korzystanie ANSI Data dosłowne, podobnie jak 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>
Jak widać, podczas zapisywania daty w tabeli, to używa typ 12. Drugi typ typu 13 jest używany podczas przekształcania literału literowego na datę za pomocą funkcji daty lub daty zwróconej przez funkcje daty wewnętrznej, takie jak SYSDATE
/CURRENT_DATE
.
Zastanawiam się, ile bitów trzeba by przechowywać znaczniki czasu uniksowego w zakresie od -4713 do 9999 ... –
@AlvaroGonzalez: to byłoby 14711 lat. Ile sekund w ciągu tych wielu lat? Jeśli powiemy, że w ciągu roku jest 365,25 dni, to w ciągu roku jest 31557600 sekund, co oznacza, że w 14711 roku jest 464 243 853 600 sekund. Tak więc poradziłaby sobie z tym wartość 39-bitowa (max = 549,755,813,888). 64-bitowy numer poradziłby sobie z tym w przewidywalnym (w przybliżeniu w roku 584,542,041,377) przyszłym :-). –