DATETIME start DATETIME end
Ti imploro di usare invece due valori DATETIME , etichettati con qualcosa come event_start e event_end .
Il tempo è un affare complesso
La maggior parte del mondo ha ora adottato il sistema metrico basato sul denery per la maggior parte delle misurazioni, a torto oa ragione. Questo è un bene nel complesso, perché almeno possiamo essere tutti d'accordo che g, è un ml, è un cm cubo. Almeno approssimativamente così. Il sistema metrico ha molti difetti, ma almeno è costantemente imperfetto a livello internazionale.
Con il tempo, tuttavia, abbiamo; 1000 millisecondi in un secondo, da 60 secondi a un minuto, da 60 minuti a un'ora, 12 ore per ogni mezza giornata, circa 30 giorni al mese che variano in base al mese e persino all'anno in questione, ogni paese ha il suo tempo compensato dagli altri , il modo in cui l'ora è formattata in ogni paese varia.
È molto da digerire, ma il lungo e il corto è impossibile per uno scenario così complesso avere una soluzione semplice.
Alcuni angoli possono essere tagliati, ma ci sono quelli in cui è meglio non farlo
Sebbene la risposta migliore qui suggerisca che memorizzare un numero intero di minuti dopo la mezzanotte potrebbe sembrare perfettamente ragionevole, ho imparato a evitare di farlo nel modo più duro.
I motivi per implementare due valori DATETIME sono per un aumento di precisione, risoluzione e feedback.
Questi sono tutti molto utili quando il design produce risultati indesiderati.
Sto memorizzando più dati del necessario?
All'inizio potrebbe sembrare che vengano archiviate più informazioni di quelle necessarie, ma c'è una buona ragione per accettare questo colpo.
Memorizzare queste informazioni extra finisce quasi sempre per farmi risparmiare tempo e fatica a lungo termine, perché inevitabilmente scopro che quando a qualcuno viene detto quanto tempo ha impiegato qualcosa, vorranno anche sapere anche quando e dove si è verificato l'evento.
È un pianeta enorme
In passato, sono stato colpevole di ignorare che ci sono altri paesi su questo pianeta oltre al mio. All'epoca sembrava una buona idea, ma questo ha SEMPRE provocato problemi, mal di testa e perdite di tempo in seguito. Considera SEMPRE tutti i fusi orari.
C #
Un DateTime esegue correttamente il rendering di una stringa in C #. Il metodo ToString (string Format) è compatto e di facile lettura.
Per esempio
new TimeSpan(EventStart.Ticks - EventEnd.Ticks).ToString("h'h 'm'm 's's'")
Server SQL
Inoltre, se stai leggendo il tuo database separatamente dall'interfaccia dell'applicazione, dateTimes è piacevole da leggere a colpo d'occhio e l'esecuzione di calcoli su di essi è semplice.
Per esempio
SELECT DATEDIFF(MINUTE, event_start, event_end)
Standard di data ISO8601
Se utilizzi SQLite, non lo hai, quindi utilizza un campo di testo e memorizzalo in formato ISO8601, ad es.
"2013-01-27T12: 30: 00 + 0000"
Appunti:
Utilizza l'orologio a 24 ore *
La parte di offset dell'ora (o +0000) della ISO8601 mappa direttamente al valore di longitudine di una coordinata GPS (senza considerare l'ora legale o in tutto il paese).
Per esempio
TimeOffset=(±Longitude.24)/360
... dove ± si riferisce alla direzione est o ovest.
Vale quindi la pena considerare se valga la pena memorizzare longitudine, latitudine e altitudine insieme ai dati. Ciò varierà nell'applicazione.
ISO8601 è un formato internazionale.
Il wiki è molto utile per ulteriori dettagli su http://en.wikipedia.org/wiki/ISO_8601 .
La data e l'ora vengono memorizzate nell'ora internazionale e l'offset viene registrato a seconda di dove è stata memorizzata l'ora nel mondo.
Nella mia esperienza c'è sempre la necessità di memorizzare la data e l'ora complete, indipendentemente dal fatto che io pensi che ci sia quando inizio il progetto. ISO8601 è un ottimo modo per farlo a prova di futuro.
Ulteriori consigli gratuiti
Vale anche la pena raggruppare gli eventi insieme come una catena. Ad esempio, se si registra una gara, l'intero evento potrebbe essere raggruppato per racer, race_circuit, circuit_checkpoints e circuit_laps.
Nella mia esperienza, è anche saggio identificare chi ha archiviato il record. O come tabella separata popolata tramite trigger o come colonna aggiuntiva all'interno della tabella originale.
Più metti, più ne esci
Capisco perfettamente il desiderio di essere il più economico possibile con lo spazio, ma raramente lo farei a scapito della perdita di informazioni.
Una regola pratica con i database è come dice il titolo, un database può solo dirti quanto ha dati e può essere molto costoso tornare indietro attraverso i dati storici, colmando le lacune.
La soluzione è farlo correttamente la prima volta. Questo è certamente più facile a dirsi che a farsi, ma ora dovresti avere una visione più approfondita di una progettazione di database efficace e, di conseguenza, avere maggiori possibilità di farlo bene la prima volta.
Migliore è il tuo progetto iniziale, meno costose saranno le riparazioni successive.
Dico solo tutto questo, perché se potessi tornare indietro nel tempo, è quello che mi direi una volta arrivato.