2013-03-19 6 views
7

Se si desidera memorizzare data e ora, è meglio memorizzarli in una data e un'ora separate o utilizzare un singolo datetime?Quando utilizzare data e ora separate invece di un singolo datetime

Quando dovremmo utilizzare la data e l'ora anziché un singolo datetime?

Desidero filtrare le mie query utilizzando la data o l'ora.

+1

Dipende da cosa è necessario usarlo per davvero. Non c'è una buona ragione solo per usarne uno di default. – CathalMF

risposta

5

In SQL Server 2008 si dispone di date and time data types in modo che questo non sia un problema.

Se è una buona scelta dipende molto dalla vostra attività e da come interrogherete i vostri dati.

Se per esempio volete conoscere tutte le ordini posti tra 1 e 02:00 per tutti i giorni con un separato colonna Date e Time renderà più veloce

+0

È interessante notare che le query sono più veloci solo per gli intervalli di tempo. Avete dei dati per sostanziarlo o sono basati su una struttura di indice del regesto di assunzione? –

+1

Interrogare i dati utilizzando una colonna DATETIME che filtra appena in tempo sarebbe più complicato in quanto richiederebbe una scansione –

+0

Sì, desidero interrogare i miei dati utilizzando la data per qualsiasi ora o l'ora per qualsiasi data. – Harke

1

Da un punto di vista tecnico, una data ha sempre un orario e un'ora sempre una data. Se si memorizza un orario nel database, ha una data predefinita che viene applicata ad esso. Se si memorizza solo una data, l'ora sarà mezzanotte in tale data (00:00:00).

A mio parere è sempre consigliabile archiviare entrambi insieme poiché le funzioni possono quindi essere applicate su un singolo campo, a seconda dei casi, se è necessario effettuare confronti su Data o Ora.

+2

eh - no. Dipende da cosa è il contesto. Ad esempio, l'orario di lavoro di un ristorante ha componenti temporali senza contesto di date fisse, e il giorno di San Valentino si svolge il 14 febbraio senza un particolare periodo di tempo. –

+0

aggiornerò il mio post. Intendevo a livello tecnico, anche se speravo che fosse ovvio con la lettera maiuscola utilizzata nelle parole Data e ora. – aaroncatlin

8

Quando si parla di un momento nel tempo, se un momento universale o una data e un'ora specifiche nel calendario locale di qualcuno, si utilizza uno datetime. Se vuoi essere sicuro di parlare di un momento preciso nel tempo, indipendentemente dall'osservatore, allora usi uno datetimeoffset.

Se si sta memorizzando solo un date, si intende una data senza componente orario, che significa "in qualsiasi momento in questa data".

Se si sta memorizzando solo un time, si intende un orario senza componente di data, che significa "questa volta in qualsiasi data" o "questa volta in una data determinata con altri mezzi".

Non vi è alcuna utilità pratica per avere sia un date e un time che sono circa la stessa cosa, seduti sulla stessa riga. Basta usare uno datetime per quello.

1

niente di eccezionale circa la data e l'ora di separazione,

Meglio risparmiare data e l'ora in stessa colonna,

Qui hanno discusso lo stesso problema lo controlla: are-there-any-good-reasons-for-keeping-date-and-time-in-separate-columns

è anche possibile ottenere la data e tempo separatamente per query

SELECT 
    CONVERT(VARCHAR(10),GETDATE(),111) as DatePart, 
    convert(varchar(15), getdate(), 108) TimePart 
+0

In realtà ci sono ottimi motivi per dividerli. Ad esempio, usa il datatype Date quando non ti importa del tempo .. dica dateofbirth .. in questo modo i calcoli della tua età sono molto più semplici. Il tipo di dati temporali è eccellente per eseguire calcoli di spostamento. Voglio tutti quelli che hanno lavorato alle 17:00 indipendentemente dalla data. Puoi dividerli come hai fatto ma poi sono varchar e alcuni calcoli diventano molto più difficili. Quale è maggiore '01: 00 PM 'o '12: 30: 00 AM'? –

2

Se intenzionalmente non ti interessa il tempo, è più efficiente archiviare è un dato come datatype. Pensa a una colonna dei compleanni dei clienti, non ci sono troppi casi a cui posso pensare che userebbero questa volta. Se vi capita di trovarvi un tempo (spesso un bug), è necessario rimuoverlo tramite un'istruzione convert per fare un confronto. Inoltre, consuma spazio aggiuntivo se non sono necessari questi valori (3 byte rispetto a 8).

Penso che sia simile ad avere una tabella di codici di stato con l'id come bigint invece di un minuscolo o simile (a seconda di quanti codici di stato si prevede di avere).

E 'solo una questione di cosa stai usando i dati, se pensi ci sia una buona possibilità che tu abbia mai bisogno di quei dati, quindi usa il datetime, altrimenti usa la data.

Problemi correlati