620 votos

SQL Server datetime2 vs datetime

Que uno:

  • datetime
  • datetime2

es LA forma recomendada para almacenar la fecha y la hora en SQL Server 2008+?

Soy consciente de las diferencias en la precisión (y espacio de almacenamiento, probablemente), pero haciendo caso omiso de aquellos que, por ahora, existe un documento de las mejores prácticas sobre cuándo utilizar qué, o tal vez no deberíamos usar datetime2 sólo?

513voto

Adam Porad Puntos 4569

La documentación de MSDN datetime recomienda el uso de datetime2. Aquí está su recomendación:

Utilice el tiempo, date, datetime2 y datetimeoffset tipos de datos para los nuevos de trabajo. Estos tipos se alinean con el SQL Estándar. Ellos son más portátiles. time, datetime2 y datetimeoffset dar más segundos de precisión. datetimeoffset proporciona el tiempo zona soporte para implementada en todo el mundo aplicaciones.

datetime2 tiene mayor rango de fecha, una mayor precisión predeterminada de las fracciones, y opcional que especifica el usuario precisión. También dependiendo de la especificada por el usuario de la precisión que se puede utilizar menos espacio de almacenamiento.

425voto

marc_s Puntos 321990

DATETIME2 tiene un rango de fecha de "0001 / 01 / 01" a través de "9999 / 12 / 31", mientras que el DATETIME tipo sólo se admite el año 1753-9999.

También, si usted necesita, DATETIME2 puede ser más precisos en términos de tiempo; DATETIME está limitado a 3 1/3 milisegundos, mientras DATETIME2 puede ser exacta a 100 ns.

Ambos tipos de mapa a System.DateTime en .NET - no hay diferencia.

Si usted tiene la opción, me gustaría recomendar el uso de DATETIME2 siempre que sea posible. Yo no veo ninguna beneficios utilizando DATETIME (excepto para la compatibilidad con versiones anteriores) - vas a tener menos problemas (con las fechas están fuera de alcance y la molestia por el estilo).

Plus: si usted sólo necesita de la fecha (sin la parte del tiempo), la FECHA de uso - es sólo tan buena como DATETIME2 y ahorro de espacio, demasiado! :-) Lo mismo va para el tiempo sólo uso TIME. Que es lo que estos tipos están ahí!

Marc

152voto

imanabidi Puntos 3203

datetime2 gana en la mayoría de los aspectos, excepto (antiguas aplicaciones de Compatibilidad)

  1. mayor rango de valores
  2. mejor Precisión
  3. menor espacio de almacenamiento (opcional si el usuario especifica la precisión se especifica)

SQL Date and time data types compare - datetime,datetime2,date,TIME

tenga en cuenta los siguientes puntos

  • la sintaxis de datetime2[(precisión de fracciones de segundos)]
  • Precisión, escala
    • de 0 a 7 dígitos, con una precisión de 100 ns.
    • La precisión predeterminada es de 7 dígitos.
  • Tamaño De Almacenamiento
    • 6 bytes para la precisión de menos de 3;
    • 7 bytes de precisión 3 y 4.
    • Todos los demás precisión requieren de 8 bytes.
  • DateTime2 con precisión de fracciones de segundos de los 3 es el mismo tipo de datos DateTime. Y DateTime2(3) utiliza 7 bytes de almacenamiento en lugar de 8 bytes (SQLHINTS - DateTime Vs DateTime2)
  • Encontrar más en el valor de datetime2(Transact-SQL artículo de MSDN)

fuente de la imagen : MCTS Paced Training Kit (Exam 70-432: Microsoft® SQL Server® 2008 - Implementación y Mantenimiento de las Capítulo 3:Tablas -> Lección 1: Crear Tablas -> página 66

101voto

EBarr Puntos 5824

Yo concurr con @marc_s y @Adam_Poward -- DateTime2 es el método preferido para avanzar. Dispone de una amplia gama de fechas, de alta precisión, y se utiliza igual o menor espacio de almacenamiento (dependiendo de la precisión).

Una cosa que la discusión se perdió, sin embargo...
@Marc_s estados: Both types map to System.DateTime in .NET - no difference there. Esto es correcto, sin embargo, la inversa no es cierto...y lo que importa cuando se hace rango de fecha en las búsquedas (p. ej., "me encontrarán todos los expedientes de modificación 5/5/2010").

.NET versión de Datetime tiene similar rango y precisión a DateTime2. Cuando la asignación de un .net Datetime hasta el de edad de SQL DateTime un implícito el redondeo se produce. El antiguo SQL DateTime es exacta a 3 milisegundos. Esto significa que 11:59:59.997 está tan cerca como se puede llegar a la final del día. Nada más se redondea hasta el siguiente día.

Intente esto :

declare @d1 datetime   = '5/5/2010 23:59:59.999'
declare @d2 datetime2  = '5/5/2010 23:59:59.999'
declare @d3 datetime   = '5/5/2010 23:59:59.997'
select @d1 as 'IAmMay6BecauseOfRounding', @d2 'May5', @d3 'StillMay5Because2msEarlier'

Evitando de esta implícito el redondeo es una razón significativa para mover a DateTime2. Implícito redondeo de las fechas claramente causa de la confusión:

13voto

Rhett A Brown Puntos 61

DateTime2 causa estragos si eres un programador de Access tratando de escribir Ahora() para el campo en cuestión. Acabo de hacer un Acceso -> SQL 2008 R2 migración y puso a todos los campos de fecha y hora en DateTime2. Anexar un registro con Ahora() como el valor bombardeado. Estaba bien en el 1/1/2012 2:53:04 PM, pero no en 1/10/2012 2:53:04 PM.

Una vez que el personaje hizo la diferencia. Espero que ayude a alguien.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X