Quasi tutte le risposte e i commenti sono stati pesanti sui pro e leggeri sui contro. Ecco un riassunto di tutti i pro e contro finora, oltre ad alcuni contro cruciali (nel n. 2 di seguito) che ho visto menzionato solo una volta o per niente.
- PROFESSIONISTI:
1.1. Più conforme ISO (ISO 8601) (anche se non so come questo entri in gioco nella pratica).
1.2. Più intervallo (dall'1 / 1/0001 al 31/12/9999 rispetto al 1/1 / 1753-12 / 31/9999) (sebbene l'intervallo supplementare, tutto prima dell'anno 1753, probabilmente non verrà utilizzato tranne che per es., in app storiche, astronomiche, geologiche, ecc.).
1.3. Corrisponde esattamente all'intervallo dell'intervallo di DateTime
tipi di .NET (sebbene entrambi convertano avanti e indietro senza codifica speciale se i valori rientrano nell'intervallo e nella precisione del tipo di destinazione, ad eccezione di Con # 2.1, altrimenti si verificheranno errori / arrotondamenti).
1.4. Maggiore precisione (100 nanosecondi aka 0.000.000,1 sec. Vs. 3,33 millisecondi aka 0,003,33 sec.) (Anche se la precisione extra probabilmente non verrà utilizzata se non per es., In app di ingegneria / scientifiche).
1.5. Se configurato per una precisione simile (come in 1 millisec non "uguale" (come in 3,33 millisec) come affermato da Iman Abidi) DateTime
, usa meno spazio (7 contro 8 byte), ma ovviamente perdi vantaggio di precisione che è probabilmente uno dei due (l'altro è il range) più propagandato sebbene probabilmente benefici non necessari).
- CONS:
2.1. Quando si passa un parametro a un .NET SqlCommand
, è necessario specificare System.Data.SqlDbType.DateTime2
se si sta passando un valore al di fuori DateTime
dell'intervallo e / o della precisione di SQL Server , perché per impostazione predefinita è System.Data.SqlDbType.DateTime
.
2.2. Non può essere implicitamente / facilmente convertito in un valore numerico in virgola mobile (numero di giorni dalla data-ora minima) per eseguire le seguenti operazioni su / con esso nelle espressioni di SQL Server utilizzando valori numerici e operatori:
2.2.1. aggiungere o sottrarre # di giorni o giorni parziali. Nota: l'utilizzo della DateAdd
funzione come soluzione alternativa non è banale quando è necessario considerare più se non tutte le parti della data-ora.
2.2.2. prendere la differenza tra due date-orari ai fini del calcolo dell '"età". Nota: non è possibile semplicemente utilizzare la DateDiff
funzione di SQL Server , perché non viene calcolata age
come la maggior parte delle persone si aspetterebbe che se le due date-date attraversano un limite di data / ora del calendario / orologio delle unità specificate se anche per una piccola frazione di quell'unità, restituirà la differenza come 1 di quell'unità rispetto a 0. Ad esempio, l' DateDiff
in Day
's di due date-time a solo 1 millisecondo di distanza restituirà 1 vs. 0 (giorni) se tali time-date sono in diversi giorni di calendario (ad es. "1999-12-31 23: 59: 59.9999999" e "2000-01-01 00: 00: 00.0000000"). La stessa differenza di 1 millisecondo di date-orari se spostata in modo che non attraversino un giorno di calendario, restituirà un "DateDiff" in Day
's di 0 (giorni).
2.2.3. prendere la Avg
data-ora (in una query aggregata) semplicemente convertendo prima in "Float" e poi di nuovo in DateTime
.
NOTA: per convertire DateTime2
in un numero, devi fare qualcosa come la seguente formula che presuppone che i tuoi valori non siano inferiori all'anno 1970 (il che significa che stai perdendo tutto l'intervallo extra più altri 217 anni. Nota: potresti non essere in grado di regolare semplicemente la formula per consentire un intervallo extra perché potresti riscontrare problemi di overflow numerico.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Fonte: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "
Naturalmente, si potrebbe anche Cast
a DateTime
prima (e, se necessario, di nuovo a DateTime2
), ma che ci si perde la precisione e la gamma (tutti prima dell'anno 1753) le prestazioni di DateTime2
rispetto DateTime
che sono prolly il 2 più grande e anche allo stesso tempo prolly il 2 meno probabilmente necessario che pone la domanda perché usarlo quando si perdono le conversioni implicite / facili in virgola mobile (numero di giorni) per il vantaggio di addizione / sottrazione / "età" (vs. DateDiff
) / Avg
calc che è grande nella mia esperienza.
A proposito, la Avg
data-ora è (o almeno dovrebbe essere) un caso d'uso importante. a) Oltre all'uso per ottenere la durata media quando le date-time (poiché una data-ora di base comune) sono utilizzate per rappresentare la durata (una pratica comune), b) è anche utile ottenere una statistica di tipo dashboard su quale sia la data media- ora è nella colonna data-ora di un intervallo / gruppo di righe. c) Una query ad hoc standard (o almeno dovrebbe essere standard) per monitorare / risolvere i problemi in una colonna che potrebbe non essere mai valida / non più e / o potrebbe essere deprecata è elencare per ogni valore il conteggio delle occorrenze e (se presenti) i Min
, Avg
e Max
data-ora francobolli associati con quel valore.