Casi todas las respuestas y comentarios han sido pesados en los pros y ligeros en los contras. Aquí hay un resumen de todos los pros y contras hasta ahora más algunos contras cruciales (en el n. ° 2 a continuación) que solo he mencionado una vez o no.
- PROS:
1.1. Más compatible con ISO (ISO 8601) (aunque no sé cómo esto entra en juego en la práctica).
1.2. Más rango (1/1/0001 a 31/12/9999 vs. 1/1 / 1753-12 / 31/9999) (aunque el rango adicional, todo antes del año 1753, probablemente no se utilizará, excepto por ej., en aplicaciones históricas, astronómicas, geológicas, etc.).
1.3. Coincide exactamente con el rango del rango de DateTime
Tipo de .NET (aunque ambos se convierten de ida y vuelta sin una codificación especial si los valores están dentro del rango y la precisión del tipo de destino, excepto para Con # 2.1 a continuación, de lo contrario se producirá un error / redondeo).
1.4. Más precisión (100 nanosegundos, también conocido como 0.000,000,1 segundos, frente a 3,33 milisegundos, también conocido como 0,003,33 segundos) (aunque la precisión adicional probablemente no se utilizará, excepto, por ejemplo, en aplicaciones de ingeniería / científicas).
1.5. Cuando se configura para una precisión similar (como en 1 milisegundo no "igual" (como en 3.33 milisegundos) como Iman Abidi ha afirmado) DateTime
, utiliza menos espacio (7 frente a 8 bytes), pero luego, por supuesto, estaría perdiendo el beneficio de precisión que probablemente sea uno de los dos (el otro es el rango) más promocionado, aunque probablemente beneficios innecesarios).
- CONTRAS:
2.1. Al pasar un parámetro a un .NET SqlCommand
, debe especificar System.Data.SqlDbType.DateTime2
si puede pasar un valor fuera del DateTime
rango y / o precisión del SQL Server , ya que su valor predeterminado es System.Data.SqlDbType.DateTime
.
2.2. No se puede convertir implícita / fácilmente a un valor numérico de coma flotante (# de días desde la fecha y hora mín.) Para hacer lo siguiente con / en las expresiones de SQL Server utilizando valores numéricos y operadores:
2.2.1. sumar o restar # de días o días parciales. Nota: Usar DateAdd
Function como solución alternativa no es trivial cuando necesita considerar múltiples, si no todas, partes de la fecha y hora.
2.2.2. tome la diferencia entre dos fechas y horas para fines de cálculo de "edad". Nota: No puede simplemente usar la DateDiff
función de SQL Server en su lugar, porque no computa age
como la mayoría de la gente esperaría si las dos fechas-hora cruzan un límite de fecha / hora de calendario / reloj de las unidades especificadas, aunque sea por una pequeña fracción de esa unidad, que va a devolver la diferencia como 1 de dicha unidad frente a 0. Por ejemplo, el DateDiff
de Day
's de dos pares fecha-hora a sólo 1 milisegundo aparte devolverá 1 vs 0 (días) si esos pares fecha-hora son en diferentes días calendario (es decir, "1999-12-31 23: 59: 59.9999999" y "2000-01-01 00: 00: 00.0000000"). La misma fecha y hora de diferencia de 1 milisegundo si se mueve para que no crucen un día calendario, devolverá un "DateDiff" en Day
's de 0 (días).
2.2.3. tome la Avg
fecha-hora (en una Consulta Agregada) simplemente convirtiendo a "Flotar" primero y luego nuevamente a DateTime
.
NOTA: Para convertir DateTime2
a un valor numérico, debe hacer algo como la siguiente fórmula, que aún asume que sus valores no son inferiores al año 1970 (lo que significa que está perdiendo todo el rango adicional más otros 217 años. Nota: puede no podrá simplemente ajustar la fórmula para permitir un rango adicional porque puede encontrarse con problemas de desbordamiento numérico.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Fuente: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "
Por supuesto, también podría Cast
a DateTime
primera (y si es necesario volver de nuevo a DateTime2
), pero se perdería la precisión y alcance (todos los anteriores a 1753 años) beneficios de la DateTime2
frente DateTime
que son Prolly la 2 más grande y también, al mismo tiempo Prolly el 2 menos probable que sea necesario, lo que plantea la pregunta de por qué usarlo cuando pierde las conversiones implícitas / fáciles a números numéricos de punto flotante (# de días) para beneficio de suma / resta / "edad" (vs. DateDiff
) / Avg
calcs, que es uno grande en mi experiencia.
Por cierto, la Avg
fecha-hora es (o al menos debería ser) un caso de uso importante. a) Además del uso para obtener la duración promedio cuando las fechas-hora (ya que una fecha-hora base común) se usan para representar la duración (una práctica común), b) también es útil obtener una estadística de tipo panel de control sobre cuál es la fecha promedio- hora está en la columna de fecha y hora de un rango / grupo de Filas. c) Una consulta estándar (o al menos debería ser estándar) ad-hoc para monitorear / solucionar problemas en una columna que puede no ser válida alguna vez / por más tiempo y / o que deba ser desaprobada es enumerar para cada valor el recuento de ocurrencias y (si está disponible) los Min
, Avg
y Max
sellos de fecha y hora asociados con ese valor.