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

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

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

Cuando conviertes un smalldatetime valor a datetimeoffset , la pequeña fecha el valor se copia en datetimeoffset valor. Los segundos fraccionarios se establecen en 0 y el desplazamiento de la zona horaria se establece en +00:0.

La pequeña fecha y hora el tipo de datos no tiene segundos fraccionarios y su componente de segundos siempre se establece en cero (:00). Su precisión es al minuto más cercano.

El desplazamiento de fecha y hora 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). También tiene una compensación de zona horaria y puede conservar cualquier compensación en el valor original. Sin embargo, smalldatetime no tiene conciencia de zona horaria, por lo que no hay valores existentes para preservar. En este caso, el desplazamiento de la zona horaria se establece en +00:00.

SQL Server en realidad tiene el TODATETIMEOFFSET() función, que está diseñada específicamente para convertir un valor de fecha/hora a datetimeoffset y agregue un desplazamiento de zona horaria. Sin embargo, vea a continuación mis comentarios y algunos ejemplos con respecto a esta opción.

Ejemplo 1:conversión implícita

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultado:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 en segundo plano cuando intentamos asignar el smalldatetime valor a un datetimeoffset variables.

Podemos ver que el datetimeoffset variable tiene una parte fraccionaria ( 0000000 ), mientras que smalldatetime valor no tiene parte fraccionaria, y sus minutos fueron redondeados al asignarle el valor inicial. El desplazamiento de fecha y hora el valor también incluye un desplazamiento de zona horaria de +00:00 .

El uso de una precisión de 7 fracciones de segundo provoca datetimeoffset para usar 11 bytes para el almacenamiento (10 bytes para almacenar los datos, 1 byte para la precisión). En comparación, smalldatetime utiliza sólo 4 bytes. Sin embargo, puede reducir la precisión del datetimeoffset valor reemplazando el 7 con un número más bajo. Si desea eliminar por completo la parte de los segundos fraccionarios, simplemente use datetimeoffset(0) . Hacer esto reducirá el tamaño de almacenamiento a 9 bytes (incluido 1 para la precisión).

Ejemplo 2: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 smalldatetime y desplazamiento de fecha y hora .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Resultado:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Ejemplo 3: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 @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';

Resultado:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

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

El hecho de que estés convirtiendo tu smalldatetime valores a datetimeoffset significa que probablemente lo esté haciendo por el desplazamiento de la zona horaria. Y es probable que desee configurarlo con un desplazamiento diferente a +00:00 (el desplazamiento predeterminado).

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

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

He aquí un ejemplo:

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

Resultado:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

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

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Resultado:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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ó. En este caso es un smalldatetime argumento, que no tiene segundos fraccionarios.

Mi sistema devuelve ceros finales con datetimeoffset parte fraccionaria, sin embargo, es posible que vea algo como esto:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

De cualquier manera, aún puede aprovechar al máximo el datetimeoffset precisión del tipo de datos si necesita modificar el valor más adelante.

Aquí hay un ejemplo que usa DATEADD() función para cambiar los segundos fraccionarios después de que la conversión ya se haya realizado.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Resultado (usando salida vertical):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00