Come vengono archiviate le date in Oracle?

Come vengono archiviate le date in Oracle? Per esempio, so che la maggior parte dei sistemi usa Epoch time per determinare che ore sono. Calcolando quanti secondi di distanza dal 1 ° gennaio 1970. Anche Oracle fa questo?

La ragione per cui la sto chiedendo è che se prendi due date in Oracle e le sottrai, ottieni un punto variabile di quanti giorni ci sono tra.

Esempio

(Sysdate - dateColumn) 

restituirebbe qualcosa del genere (a seconda dell’ora)

 3.32453703703703703703703703703703703704 

Ora Oracle sta eseguendo la conversione e sputa quel formato, oppure Oracle memorizza le date con quanti giorni è lontano da un certo intervallo di tempo? (Come il tempo di Epoch)

    Sono due tipi 12 e 13

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

    Digitare 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

    Digitare 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

    Dal manuale su http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151

    Per ciascun valore DATE, Oracle memorizza le seguenti informazioni: anno, mese, giorno, ora, minuto e secondo

    Quindi apparentemente non sta memorizzando un valore d’epoca che è anche confermato da questo capitolo del manuale :

    Il database memorizza le date internamente come numeri. Le date sono memorizzate in campi di lunghezza fissa di 7 byte ciascuno, corrispondenti a secolo, anno, mese, giorno, ora, minuto e secondo

    Come vengono archiviate le date in Oracle?

    I due tipi di dati 12 e 13 hanno due scopi diversi.

    • Tipo 12 – Date memorizzate nella tabella
    • Tipo 13 – Data restituita da funzioni di data interne come SYSDATE / CURRENT_DATE , anche quando si converte una stringa letterale in data utilizzando TO_DATE o ANSI Data letterale DATE 'YYYY-MM-DD' .

    Casi test:

    Impostazione della tabella di base per il tipo 12 :

     SQL> CREATE TABLE t(col DATE); Table created. SQL> INSERT INTO t SELECT SYSDATE FROM dual; 1 row created. SQL> COMMIT; Commit complete. 

    Controlla i diversi casi:

     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 

    Usando il letterale ANSI Date , proprio come 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> 

    Come puoi vedere, mentre memorizzi una data nella tabella, usa il tipo 12 . Il secondo tipo 13 viene utilizzato quando si converte una stringa letterale in data utilizzando le funzioni di data o quando la data viene restituita da funzioni di data interne come SYSDATE / CURRENT_DATE .