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

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

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

Cuando convierte un datetimeoffset valor a fecha y hora , los valores de fecha y hora se copian y el desplazamiento de zona horaria se trunca. Cuando la precisión fraccionaria del datetimeoffset valor es mayor que tres dígitos, el valor se trunca.

El desplazamiento de fecha y hora El tipo de datos le permite especificar una precisión de segundos fraccionarios de 0 a 7. Esto se hace usando 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. Se usa otro byte para almacenar la precisión, por lo que agrega 1 byte a esas cifras.

La fechahora El tipo de datos, 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. Este tipo de datos no tiene reconocimiento de zona horaria y, por lo tanto, no tiene compensación de zona horaria. Su tamaño de almacenamiento es de 8 bytes.

Ejemplo 1:conversión implícita

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

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

Resultado:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 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 datetimeoffset 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.

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

En esta conversión, el tamaño de almacenamiento ha disminuido de 10 bytes (11 bytes si incluye el byte adicional que almacena la precisión) para datetimeoffset , a 8 bytes para datetime . Sin embargo, si datetimeoffset value hubiera usado una escala de entre 0 y 2, habría usado solo 8 bytes (9 incluida la precisión).

Si hubiera utilizado una escala de 3 (el equivalente a la fechahora valor), el tamaño de almacenamiento habría sido de 9 bytes (10 con precisión). Sin embargo, su precisión habría sido mayor que datetime . Por supuesto, la precisión disminuiría tan pronto como la convirtiéramos a datetime .

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 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime datetime;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00';
SET @thedatetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime AS 'datetime';

Resultado:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |
+------------------------------------+-------------------------+

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

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 fechahora .

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

Resultado:

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

Resultado:

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