sql >> Base de Datos >  >> RDS >> Sqlserver

Convierta 'datetime' a 'datetime2' en SQL Server (ejemplos de T-SQL)

Este artículo contiene ejemplos de cómo convertir una fecha y hora valor a un datetime2 valor en SQL Server.

Cuando convierte una fecha y hora valor a datetime2 , el valor resultante dependerá de la precisión de fracciones de segundo que asigne a datetime2 .

La fechahora tipo de datos tiene un máximo de 3 dígitos para su parte de segundos fraccionarios. Su precisión se redondea a incrementos de 0,000, 0,003 o 0,007 segundos.

La fechahora2 El tipo de datos, por otro lado, le permite especificar una precisión de fracciones de segundo de 0 a 7. Si no especifica esto, usará 7 (el valor predeterminado).

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre datetime y fechahora2 .

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 |
+-------------------------+-----------------------------+

Esta es una conversión implícita porque no estamos usando una función de conversión (como las que se muestran a continuación) para convertirla explícitamente. En este caso, SQL Server realiza una conversión implícita entre bastidores cuando intentamos asignar la fecha y hora valor a un datetime2 variables.

Podemos ver que el datetime2 variable tiene más precisión de segundos fraccionarios, y terminamos con una parte fraccionaria de 1233333 (frente a 123 para la fechahora valor).

Ejemplo 2:redondeo

La fechahora el tipo de datos se redondea a incrementos de .000, .003 o .007 segundos. Incluso si lo establece explícitamente en otro valor, se redondeará. Como era de esperar, esto puede causar mucha confusión si no sabe cómo funciona. No solo puede causar confusión al usar datetime por sí mismo, puede causar confusión adicional al convertir ese valor a otro tipo de datos.

Aquí hay un ejemplo que demuestra lo que quiero decir.

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 |
+-------------------------+-----------------------------+

En este ejemplo, configuré los segundos fraccionarios en 125 pero fechahora redondeado a 127 (porque solo se puede redondear a incrementos de 0,000, 0,003 o 0,007 segundos).

La fechahora2 sin embargo, establezca los segundos fraccionarios en 1266667 .

Por cierto, si simplemente estableciéramos el valor inicial en datetime2 en primer lugar, su parte fraccionaria habría devuelto 1250000 .

Ejemplo 3:Precisión/Exactitud

Uno de los beneficios de datetime2 es que te permite especificar la precisión de las fracciones de segundo. Si no hace esto, usa 7 (por lo tanto, el ejemplo anterior usa 7).

Por lo tanto, podemos modificar el ejemplo anterior para que el datetime2 value usa la misma precisión de fracciones de segundo que datetime tipo de datos.

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(3);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:

+-------------------------+-------------------------+
| datetime                | datetime2               |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Cuando hacemos esto, el datetime2 value devuelve el mismo resultado que datetime valor. También utiliza la misma cantidad de almacenamiento (8 bytes). En este caso, datetime2 utiliza 7 bytes para almacenar el valor y 1 byte para almacenar la precisión del valor.

Incluso puede especificar menos precisión de fracciones de segundo que datetime si no necesita la precisión adicional. Hacer esto le ahorrará un byte completo en espacio de almacenamiento (su datetime2 el valor utilizará 7 bytes, en comparación con los 8 bytes de datetime valor).

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(2);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:

+-------------------------+------------------------+
| datetime                | datetime2              |
|-------------------------+------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 |
+-------------------------+------------------------+

Tenga en cuenta que esto también puede resultar en el redondeo de segundos fraccionarios.

Ejemplo 4:conversión explícita mediante CAST()

Este es un ejemplo de una conversión explícita. En este caso, uso el CAST() función directamente dentro del SELECT declaración para convertir explícitamente entre datetime y fechahora2 .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetime2(3)) AS 'datetime2(3)';

Resultado:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Ejemplo 5:conversión explícita mediante CONVERT()

Aquí hay un ejemplo de una conversión explícita usando CONVERT() función en lugar de CAST() .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetime2(3), thedatetime) AS 'datetime2(3)';

Resultado:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Recomendación de Microsoft

Microsoft recomienda usar la conversión explícita siempre que exista un escenario de comparación mixta entre estos dos tipos de datos:

Bajo el nivel de compatibilidad de base de datos 130, conversiones implícitas de datetime a fechahora2 los tipos de datos muestran una precisión mejorada al tener en cuenta las fracciones de milisegundos, lo que da como resultado diferentes valores convertidos... Use conversión explícita a datetime2 tipo de datos cada vez que un escenario de comparación mixto entre datetime y fechahora2 existen tipos de datos.