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

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

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

Cuando convierte un datetimeoffset valor para smalldatetime , se copian la fecha y la hora. Los minutos se redondean hacia arriba (según el valor de los segundos) y los segundos se establecen en 0.

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 (más 1 byte para la precisión), según la precisión que se utilice.

La pequeña fecha y hora el tipo de datos, por otro lado, no tiene reconocimiento de zona horaria y, por lo tanto, no incluye ninguna compensación de zona horaria. Tampoco tiene segundos fraccionarios, y su componente de segundos siempre se establece en cero (:00). Su precisión es al minuto más cercano. El tamaño de almacenamiento de este tipo de datos está fijado en 4 bytes.

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre datetimeoffset y pequeña fecha y hora .

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

Resultado:

+------------------------------------+---------------------+
| datetimeoffset                     | smalldatetime       |
|------------------------------------+---------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16: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 datetimeoffset valor a un smalldatetime variables.

Podemos ver que el smalldatetime La variable no tiene precisión de segundos fraccionarios y sus segundos se han establecido en cero. Además, los minutos se han redondeado, debido a que el valor original tenía un valor de segundos de 30.

Otra observación es que el desplazamiento de la zona horaria se truncó:smalldatetime 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 cuenta la precisión) para datetimeoffset , a 4 bytes para smalldatetime .

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 datetimeoffset y pequeña fecha y hora .

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

Resultado:

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

Resultado:

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