2009-10-08 32 views
5

Estúpido problema fácil, pero no he podido encontrar una solución elegante. Quiero almacenar intervalos de tiempo en columnas MySQL, por ejemplo:¿La mejor manera de almacenar valores de intervalo de tiempo en MySQL?

1:40 (durante una hora, 40 minutos) 0:30 (30 minutos).

A continuación, podrá ejecutar consultas y resumirlas. Ahora mismo los almaceno como valores INT (1.40), pero tengo que hacer la adición manualmente (a menos que me falte una manera más fácil).

El tipo de columna TIME solo almacena hasta 900 horas (aproximadamente, creo), entonces eso es (casi) inútil para mí ya que estoy rastreando cientos de miles de horas (almaceno un campo con una suma de muchos diferentes entradas).

Gracias!

Respuesta

8

almacene solo los minutos, por lo que 1:40 se almacena como 100. Esto lo hace fácil de agregar: 100 + 30 = 130. cuando lo visualiza, haga los cálculos para convertir de nuevo a horas: minutos. 130 minutos -> 2:10.

+0

He hecho algo similar en una de mis aplicaciones, sin embargo, guardo los segundos para que mi suma no pierda todos esos minutos parciales. –

+2

sí, si necesita rastrear segundos, entonces haga segundos. pero la pregunta solo pregunta sobre los minutos. – longneck

4

Simplemente los almacenaría en un campo INT en segundos o minutos (o el valor de tiempo más bajo con el que esté trabajando).

Como un ejemplo, que desea almacenar el siguiente valor de tiempo de 1 hr 34 min 25 segundos:

Eso es 5665 segundos. Por lo que sólo almacenar el valor como 5665 en un campo INT

Más tarde, digamos que usted desea almacenar el valor de tiempo de 56 min 7 segundos:

Eso es 3367 segundos.

resumir todo después: 5665 + 3367 = 9032 segundos

convertir esa vuelta a las horas, minutos, segundos, se obtiene 2 horas y 30 minutos 32 segundos. Sí, tienes que hacer los cálculos para hacer la conversión, pero es un cálculo muy simple y no requiere mucho de la máquina ya que solo lo haces una vez, antes de almacenar el INT o una vez, después de recuperar el INT.

4

definitivamente se puede utilizar un campo int para esto, sobre todo porque MySQL proporciona los DATE_ADD y DATE_SUB funciones para el uso de unidades de enteros de tiempo junto con la fecha y la fecha y hora en la fecha de tipos artihmetic.

Por ejemplo, si tiene una columna de fecha y hora eventDateTime y tiene una columna duración durationMinutes se puede calcular la fecha y hora que termina usando:

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE) 
+0

Bueno, también muestra la consulta – Va1iant

0

Si desea guardarlas como horas, y por lo tanto mantener el número entero pequeño, puede tomar el número de minutos y dividir por 60.

Entonces 1:40 se convierte en 100/60 = 1.66,: 30 se convierte en 30/60 = .5.Ahora sólo puede añadirlos con normalidad:

1.66 + .5 = 2.16 

y entonces usted tiene el número de horas como el todo y la parte decimal es el número de minutos más de 60, por lo que sería

.16 * 60 = 10 

así que es 2:10

Su próxima mejor opción es ver si MySQL puede hacer base60.

+1

Al guardar las horas como valores flotantes, es posible que tenga errores de redondeo, e. gramo. 100 minutos son * no * exactamente 1.66 horas. Con más operaciones, tu error aumenta. – joschi

+0

¿Por qué flota? Simplemente almacene los segundos, si quiere los segundos. Incluso 32 bits son suficientes para esto, y usted no tendrá errores de redondeo. Durante milisegundos, hay tipos int de 64 bits (BIGINT para la mayoría de las bases de datos SQL). – Frizi

+0

No segundos, minutos. Y op estaba pidiendo una forma de almacenar cantidades de tiempo con horas como base (por lo que los minutos serían una fracción de la base). Ni siquiera recuerdas por qué las carrozas parecían ideales. – Anthony

0

Sé que este no es el tipo de intervalo de tiempo del que está hablando, cuando busqué por aquí esta es la única pregunta relevante que encontré, así que para ayudar a otras almas perdidas como yo pensé que publicaría lo que estoy haciendo ahora

estoy almacenar una longitud de suscripción, que en lugar de valores exactos como "número de segundos" o incluso minutos es ya sea Días o Meses. Entonces en mi caso tengo una INT de "duración" y un ENUM de "duración_unidad" de ('días', 'meses').

Por lo tanto, para una suscripción de "6 meses" en lugar de tratar de calcular cuántos minutos hay en 6 meses (que varía según los 6 meses de los que habla) solo guardo "6" y "meses".

Con el método mktime() de PHP es fácil y más preciso calcular intervalos de tiempo de +6 meses.

Cuestiones relacionadas