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

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

Este artículo contiene ejemplos de cómo convertir un datetimeoffset valor a datetime2 en el servidor SQL.

Cuando convierte un datetimeoffset valor a datetime2 , la fecha y la hora se copian en datetime2 y la zona horaria se trunca. Los segundos fraccionarios también se truncan para que quepan si la precisión del destino es menor.

El desplazamiento de fecha y hora El tipo de datos le permite especificar una precisión de segundos fraccionarios de 0 a 7 mediante el datetimeoffset(n) sintaxis. Si no especifica esto, usará 7 (el valor predeterminado). También tiene un desplazamiento de zona horaria. El tamaño de almacenamiento de este tipo de datos es de 8, 9 o 10 bytes, según la precisión que se utilice.

La fechahora2 El tipo de datos también le permite especificar una precisión de segundos fraccionarios de 0 a 7 (usando el datetime2(n) sintaxis). No tiene reconocimiento de zona horaria. Su tamaño de almacenamiento es de 6, 7 u 8, según la precisión que se utilice.

Tenga en cuenta que las cantidades de almacenamiento enumeradas aquí son las cantidades enumeradas en la documentación de Microsoft. Sin embargo, estos tipos de datos también usan 1 byte para almacenar la precisión. Por lo tanto, agregue 1 byte a las cantidades enumeradas aquí para obtener una imagen más completa de los requisitos de almacenamiento.

Ejemplo 1:conversión implícita

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime2 datetime2;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Resultado:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

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 datetimeoffset valor a un datetime2 variables.

En este ejemplo, ambos tipos de datos utilizan la precisión predeterminada (7 decimales). Por lo tanto, la parte fraccionaria era 1234567 para ambos resultados.

También vemos que el desplazamiento de la zona horaria se truncó:datetime2 el tipo de datos no tiene reconocimiento de zona horaria.

En esta conversión, el tamaño de almacenamiento ha disminuido de 10 bytes (para datetimeoffset ) a 8 bytes (para datetime2 ), aunque tenga en cuenta que se agrega 1 byte para almacenar la precisión.

Ejemplo 2:diferente precisión

Aquí hay un ejemplo que demuestra lo que sucede si datetime2 El valor utiliza una precisión inferior al datetimeoffset valor.

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Resultado:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |
+------------------------------------+-------------------------+

En este ejemplo, el datetimeoffset tiene una escala de 7 pero el datetime2 el valor tiene una escala de solo 3 . Por lo tanto, las fracciones de segundo se truncaron para que quepan.

Tenga en cuenta que esto podría provocar que se produzca el redondeo. Aquí hay un ejemplo donde la parte fraccionaria de datetime2 el valor se redondea a 124 .

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Resultado:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |
+------------------------------------+-------------------------+

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 datetimeoffset y fechahora2 .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS datetime2) AS 'datetime2';

Resultado:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

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 @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2';

Resultado:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+