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

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

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

Cuando conviertes un datetime2 valor a datetimeoffset , el valor resultante dependerá de la precisión de las fracciones de segundo que se asigna a cada tipo de datos, así como del desplazamiento de la zona horaria que especifique.

Ambos tipos de datos le permiten especificar una precisión de fracciones de segundo de 0 a 7. Si no especifica esto, se utiliza la escala predeterminada de 7.

El desplazamiento de fecha y hora El tipo de datos incluye una compensación de zona horaria y puede conservar cualquier compensación en el valor original. Sin embargo, datetime2 no tiene conciencia de zona horaria, por lo que no hay valores existentes para preservar. En este caso, el desplazamiento de la zona horaria por defecto es +00:00.

El TODATETIMEOFFSET() La función fue diseñada específicamente para convertir un valor de fecha/hora a datetimeoffset y agregue un desplazamiento de zona horaria. Sin embargo, vea mis comentarios (y ejemplos) a continuación con respecto a esta opción.

Ejemplo 1:conversión implícita

Primero, aquí hay un ejemplo de una conversión implícita entre datetime2 y desplazamiento de fecha y hora .

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

Resultado:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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

Podemos ver que el datetimeoffset la variable puede usar la misma precisión que datetime2 valor (7 decimales). También terminamos con un desplazamiento de zona horaria de +00:00 .

El uso de una precisión de 7 fracciones de segundo provoca datetimeoffset usar 11 bytes para el almacenamiento (10 para los datos y 1 byte para la precisión). La fechahora2 type usa 9 bytes (8 para los datos y 1 byte para la precisión) cuando se usa una escala de 7.

Sin embargo, puede reducir la precisión reemplazando el 7 con un número más bajo.

Ejemplo 2:redondeo

Si datetimeoffset tiene una precisión menor que el datetime2 valor, se redondeará hacia arriba.

He aquí un ejemplo:

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

Resultado:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

En este ejemplo, datetime2 value tiene una escala de 7 pero el datetimeoffset la escala del valor es solo 6. Por lo tanto, su precisión es solo de 6 decimales, y su sexto dígito se redondea a 7 (en lugar de 6).

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 desplazamiento de fecha y hora .

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

Resultado:

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

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(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Resultado:

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

Ejemplo 5:cambiar la compensación de la zona horaria

Si está convirtiendo desde datetime2 a datetimeoffset , probablemente lo estés haciendo por el desplazamiento de la zona horaria. También es muy probable que necesite un valor distinto al predeterminado +00:00.

Afortunadamente, puedes usar el TODATETIMEOFFSET() función para cambiar el desplazamiento.

También puede usar esta función para convertir el datetime2 original valor a un datetimeoffset valor. Esta función acepta cualquier valor de fecha/hora que pueda resolverse como datetime2 y un valor de compensación.

He aquí un ejemplo:

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

Resultado:

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

Y aquí hay un ejemplo usando la función dentro de SELECT declaración:

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

Resultado:

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

Un punto importante sobre el TODATETIMEOFFSET() función es que utiliza la misma precisión fraccionaria que el argumento de fecha/hora que se le pasó.

Por lo tanto, si su datetime2 usa una precisión más baja que datetimeoffset , siempre puede reasignarlo a una variable con mayor precisión y luego pasar ese valor convertido a TODATETIMEOFFSET() .

Ejemplo:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Resultado (usando salida vertical):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00