2009-11-23 14 views
19

In un campo ho bisogno di memorizzare non una coppia datetime, cioè una data Oracle standard.Come memorizzare solo il tempo; non data e ora?

01/10/2009 22:10:39 

Ma il tempo solo

22:10:39 

penso che risparmiare spazio su disco (ho 2 milioni di righe) o fornire un'elaborazione più rapida.

+3

Nel grande schema delle cose, 2 milioni di righe è praticamente nulla. Il magro risparmio di spazio vale la perdita di precisione? – kurosch

+1

Immagino che la domanda che avrei dovuto fare fosse "elaborazione più veloce di cosa?" Se tutto ciò che hai è ora, non puoi paragonarlo a qualcos'altro in modo affidabile, quindi non puoi memorizzare nulla e salvare te stesso l'intero 7 byte per riga. – kurosch

risposta

10

Si potrebbe provare l'INTERVAL DAY TO SECOND tipo di dati, ma ha vinto Ti risparmio spazio su disco ... è molto adatto a questo scopo però.

create table t1 (time_of_day interval day (0) to second(0)); 

insert into t1 values (TO_DSINTERVAL('0 23:59:59')); 

select date '2009-05-13'+time_of_day 
from t1; 

11 byte però.

6

La tua migliore scommessa probabilmente sarebbe memorizzare "secondi da mezzanotte" come un campo numerico.

SELECT to_char(SYSDATE, 'SSSSS') FROM dual; 
+1

Ovviamente, è necessario tenere conto di (1) penalità di perequità per convertire sempre i valori e (2) penalità per il tempo di sviluppo per l'utilizzo di calcoli bizzarri per aritmetici di date altrimenti standard. – jva

+0

@jva: sì, stavo per dirlo, ma nel momento in cui ci ho pensato ho capito che questo thread era praticamente morto, quindi perché preoccuparsi di – kurosch

+1

mi piace questo approccio, ma vale la pena menzionare due cose. I dati devono essere memorizzati in un numero per garantire che non sia possibile inserire caratteri e ci dovrebbe essere un vincolo di controllo sulla colonna, assicurando che non sia possibile immettere più di 24 ore in secondi. – Ben

2

è possibile estrarre il tempo da una data come una stringa come questa:

to_char(sysdate,'HH.MI.SS') 

, ma non c'è tempo solo tipo di dati che vi aiuterà a risparmiare spazio.

+0

Se lo si memorizza come VARCHAR qualsiasi cosa può essere memorizzata nella colonna, il che non è molto utile quando si prova a estrarlo di nuovo. – Ben

0

Si risparmia qualche Mb di spazio su disco (che non è nulla al giorno d'oggi) e si otterrebbe quasi nulla in termini di prestazioni.

È possibile utilizzare una colonna del tipo NUMBER per memorizzare il numero di secondi dalla mezzanotte come suggerito, ma non dimenticare i vincoli.
(si sarebbe probabilmente utilizzare NUMBER(5, 0) che utilizza 1-3 byte a seconda del valore memorizzato, invece di una costante 7 byte utilizzati da una colonna DATE)

0

è possibile utilizzare:

TO_CHAR(<DATE_COLUMN>, '<TIME_FORMAT>'); 

esempio

TO_CHAR(SYSDATE, 'HH24:MI:SS'); 

per il formato di tempo è possibile controllare in here