2009-11-23 27 views
19

En un campo, no debo almacenar un par de fecha y hora, es decir, una fecha estándar de Oracle.Cómo almacenar solo el tiempo; no fecha y hora?

01/10/2009 22:10:39 

Pero el tiempo solamente

22:10:39 

creo que ahorrar espacio en disco (tengo 2 millones de filas) o proporcionar un procesamiento más rápido.

+3

En el gran esquema de las cosas, de 2 millones de filas es prácticamente nada. ¿Vale la pérdida de precisión el escaso ahorro de espacio? – kurosch

+1

Supongo que la pregunta que debería haber hecho es "¿procesamiento más rápido de qué?" Si todo lo tienes a la hora del día, no puedes compararlo con otra cosa de manera confiable, así que no puedes almacenar nada y ahorrarte los 7 bytes por fila. – kurosch

Respuesta

10

puede probar con el INTERVALO DE DÍA PARA SEGUNDO tipo de datos pero ganaron le ahorrará espacio en disco ... sin embargo, es muy adecuado para este propósito.

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 bytes though.

6

Su mejor opción sería almacenar "segundos desde la medianoche" como un campo numérico.

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

Por supuesto, debe tener en cuenta una (1) penalización de rendimiento por convertir siempre los valores y (2) una penalización de tiempo de desarrollo por usar cálculos extraños para aritméticos de fecha estándar. – jva

+0

@jva: Sí, lo iba a mencionar, pero cuando pensé en ello pensé que este hilo estaba prácticamente muerto, ¿por qué molestarse? – kurosch

+1

Me gusta este enfoque, pero vale la pena mencionar dos cosas. Los datos deben almacenarse en un número para asegurarse de que no puede insertar caracteres y debe haber una restricción de verificación en la columna que garantice que no puede ingresar más de 24 horas en segundos. – Ben

2

puede extraer el tiempo de una fecha como una cadena como esta:

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

pero no hay una única vez, el tipo de datos que le ayudará a ahorrar espacio.

+0

Si lo almacena como VARCHAR cualquier cosa puede almacenarse en la columna, lo cual no es muy útil cuando se trata de sacarla de nuevo. – Ben

0

Ahorrarías unos pocos Mb de espacio en disco (lo cual no es nada hoy en día) y ganarías casi nada en rendimiento.

Puede usar una columna del tipo NUMBER para almacenar el número de segundos desde la medianoche como se sugiere, simplemente no se olvide de las restricciones.
(que probablemente utilice NUMBER(5, 0) que utiliza 1-3 bytes, dependiendo del valor almacenado, en lugar de una constante de 7 bytes utilizados por una columna DATE)

0

puede utilizar:

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

ejemplo

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

del formato de hora se puede comprobar en here

Cuestiones relacionadas