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

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

Probablemente haya muy pocos casos de uso que le hagan convertir un datetime2 valor a fecha y hora en el servidor SQL. En particular, el datetime2 el tipo de datos se puede configurar para usar el mismo tamaño de almacenamiento que datetime , pero con mayor precisión. Entonces, en la mayoría de los casos, estaría mejor con datetime2 que con una fecha y hora . Microsoft también recomienda usar datetime2 en lugar de fechahora .

Sin embargo, en caso de que te encuentres en la situación en la que necesites realizar esta conversión, este artículo contiene algunos ejemplos y consideraciones que pueden ser de ayuda.

Cuando conviertes un datetime2 valor a fecha y hora , el valor resultante dependerá de las fracciones de segundo que se asignaron al datetime2 valor, así como su precisión.

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

La fechahora el tipo de dato por otro lado, 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.

Por lo tanto, si datetime2 usa una escala de 3, el valor resultante será muy cercano (si no idéntico) al valor original. Sin embargo, debido a la menor precisión de datetime , los resultados pueden ser diferentes, debido al redondeo que realiza.

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre datetime2 y fechahora .

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

Resultado:

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

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 el datetime2 valor a una fecha y hora variables.

Podemos ver que la fecha y hora variable tiene menos precisión de segundos fraccionarios, y terminamos con una parte fraccionaria de 123 aunque la parte fraccionaria original era 1234567 .

En este caso, no se realizó ningún redondeo.

Ejemplo 2:precisión/exactitud y 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á.

Esto también se aplica cuando se convierte desde otro tipo de datos (como lo que estamos haciendo aquí).

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

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

Resultado:

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

En este ejemplo, configuro los segundos fraccionarios de datetime2 valor a 1256789 pero fechahora redondeado a 127 (porque solo se puede redondear a incrementos de 0,000, 0,003 o 0,007 segundos).

Es importante tener en cuenta que esto seguirá siendo cierto, incluso si asignamos solo 3 fracciones de segundo a datetime2 valor.

Ejemplo:

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

Resultado:

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

También vale la pena estar al tanto de cualquier redondeo que pueda ocurrir en el datetime2 original. valor. La fechahora2 El valor en sí podría redondearse si intentamos asignar un valor con más fracciones de segundo que su propia escala.

Ejemplo:

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

Resultado:

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

En este caso, trato de asignar un valor con una parte fraccionaria de 1256789 . Sin embargo, debido a que datetime2(3) El valor solo tiene una escala de 3, solo admite 3 decimales y, en este caso, el último dígito se redondea hacia arriba (porque el siguiente dígito es 5 o más).

Ambos fecha y hora2(3) y fechahora use la misma cantidad de espacio de almacenamiento (8 bytes). El fechahora2(3) el tipo de datos en realidad usa 7 bytes para almacenar los datos, pero 1 byte adicional para almacenar la precisión.

Ejemplo 3: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 datetime2 y fechahora .

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

Resultado:

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

Ejemplo 4: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 @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Resultado:

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