2012-11-26 20 views
12

W jaki sposób przechowywane są daty w Oracle? Na przykład wiem, że większość systemów używa czasu Epoki, aby określić, która jest godzina. Obliczając, ile sekund dzieli nas od 1 stycznia 1970 roku. Czy Oracle też to robi?W jaki sposób przechowywane są daty w Oracle?

Powodem, dla którego o to pytam, jest to, że zauważyłem, że jeśli weźmiesz dwie daty w Oracle i odejmiesz je, otrzymasz zmiennoprzecinkową liczbę dni pomiędzy.

Przykład

(Sysdate - dateColumn) 

wróci coś takiego (w zależności od czasu)

3.32453703703703703703703703703703703704 

Teraz Oracle robi konwersję i plucie ten format się, czy też termin przechowywania danych Oracle z ilu dni jest z dala od określonych ram czasowych? (Czas jak Epoch)

+0

Zastanawiam się, ile bitów trzeba by przechowywać znaczniki czasu uniksowego w zakresie od -4713 do 9999 ... –

+1

@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 :-). –

Odpowiedz

20

dwa typy 12 i 13

http://oraclesniplets.tumblr.com/post/1179958393/my-oracle-support-oracle-database-69028-1

Type 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 

2012-11-26 16:41:09

Type 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

5

z podręcznika na http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151

dla każdej wartości DATE Oracle przechowuje następujące informacje: rok, miesiąc, dzień, godzina, minuta, a drugi

Więc najwyraźniej nie jest przechowywanie wartości epoki, która jest również potwierdzona przez this chapter of the manual:

Baza danych przechowuje daty wewnętrznie jako liczby. Terminy są zapisane na polach o stałej długości 7 bajtów każdy, odpowiednio do wieku, rok, miesiąc, dzień, godzina, minuta i sekunda

+0

@Halfwarr: zobacz moją edycję (i drugi link do instrukcji) –

+0

Bardzo interesujące, dziękuję! Miałem nadzieję, że wykorzystał datę Julii do zapisania daty. Ta metoda prawdopodobnie ma więcej sensu! – Halfwarr

+0

@Halfwarr: dlaczego obchodzi cię, jak to jest przechowywane? To w ogóle nie ma znaczenia. –

4

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.

Powiązane problemy