2009-10-08 10 views
5

Stupido problema, ma non sono stato in grado di trovare una soluzione elegante. Voglio memorizzare intervalli di tempo in colonne MySQL, ad esempio:Il modo migliore per memorizzare i valori dell'intervallo di tempo in MySQL?

1:40 (per un'ora, 40 minuti) 0:30 (30 minuti).

Quindi è possibile eseguire query, sommandole. In questo momento li memorizzo come valori INT (1.40), ma devo fare manualmente l'aggiunta (a meno che manchi un modo più semplice).

Il tipo di colonna TIME memorizza solo fino a 900 ore (circa, penso), quindi è (quasi) inutile per me poiché sto registrando verso l'alto di centinaia di migliaia di ore (memorizzo un campo con una somma di molti diversi inserimenti).

Grazie!

risposta

8

memorizza solo i minuti, quindi 1:40 viene memorizzato come 100. questo semplifica l'aggiunta: 100 + 30 = 130. quando si visualizza, fare i calcoli per riconvertire in ore: minuti. 130 minuti -> 2:10.

+0

Ho fatto una cosa simile in una delle mie app, tuttavia memorizzo i secondi invece che la mia somma non perda tutti quei minuti parziali. –

+2

sì, se è necessario tracciare secondi, quindi fare secondi. ma la domanda riguarda solo i minuti. – longneck

4

Vorrei semplicemente memorizzarli in un campo INT come secondi o minuti (o qualunque sia il valore temporale più basso con cui si sta lavorando).

A titolo di esempio, si desidera memorizzare il seguente valore tempo di 1 h 34 min 25 secondi:

Questo è 5665 secondi. Quindi, solo memorizzare il valore 5665 in un campo INT

Più tardi, diciamo che si desidera memorizzare il valore di tempo di 56 minuti 7 secondi:

Questo è 3367 secondi.

Somma a tutto dopo: 5665 + 3367 = 9032 secondo

riconvertendolo ore, minuti, secondi, si ottiene 2 ore e 30 min 32 secondi. Sì, devi fare i calcoli per effettuare la conversione, ma è un calcolo molto semplice e non è affatto intenso dal momento che lo fai solo una volta, prima di memorizzare INT o una volta, dopo aver recuperato INT.

4

si può sicuramente utilizzare un campo int per questo, soprattutto perché MySQL fornisce gli DATE_ADD e DATE_SUB funzioni per l'utilizzo di unità intere di tempo insieme a data e datetime tipi data artihmetic.

Per esempio, se si dispone di una colonna datetime eventDateTime e si dispone di una colonna durata durationMinutes è possibile calcolare il datetime termina con:

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE) 
+0

Piacevole, si mostra anche la query – Va1iant

0

Se si desidera memorizzare loro come ore, e quindi mantenere il numero intero piccolo, puoi prendere il numero di minuti e dividerlo per 60.

Quindi 1:40 diventa 100/60 = 1,66,: 30 diventa 30/60 = 0,5.Ora si può semplicemente aggiungere normalmente:

1.66 + .5 = 2.16 

e poi ci sono il numero di ore come del tutto, e la parte decimale è il numero di minuti più di 60, in modo che sarebbe

.16 * 60 = 10 

quindi è 2:10

La tua prossima opzione migliore è vedere se MySQL può fare base60.

+1

Quando si salvano le ore come valori fluttuanti si potrebbero incorrere in errori di arrotondamento, e. g. 100 minuti * non * esattamente 1,66 ore. Con ulteriori operazioni il tuo errore aumenta. – joschi

+0

Perché galleggia? Memorizza i secondi, se vuoi i secondi. Anche 32 bit sono sufficienti per questo, e non si verificheranno errori di arrotondamento. Per millisecondi, esistono tipi int a 64 bit (BIGINT per la maggior parte dei database SQL). – Frizi

+0

Non secondi, minuti. E op stava chiedendo un modo per immagazzinare quantità di tempo con ore come base (quindi i minuti sarebbero una frazione di base). Non ricordo nemmeno perché i galleggianti sembravano ideali. – Anthony

0

So che questo non è il tipo di intervallo di tempo di cui si parla, quando quando ho cercato in giro questo è l'unica domanda SO pertinente che ho trovato, quindi per aiutare altre anime perse come me ho pensato di postare cosa sto facendo ora.

sto Memorizzazione una lunghezza di abbonamento, che invece di valori precisi come "numero di secondi" o addirittura minuti è o giorni o mesi. Quindi nel mio caso ho un INT "durata" e un ENUM "durata_unità" di ('giorni', 'mesi').

Quindi per un abbonamento "6 mesi" piuttosto che cercare di calcolare quanti minuti sono in un 6 mesi (che varia a seconda dei 6 mesi di cui si parla) ho solo "6" e "mesi".

Con il metodo PHP mktime() è facile e più preciso calcolare intervalli di tempo di +6 mesi.

Problemi correlati