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

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

Si tiene un datetimeoffset valor, pero no necesita la parte de compensación de hora y zona horaria, convirtiéndola a fecha le ahorrará mucho espacio de almacenamiento (mientras elimina detalles innecesarios del valor). Este artículo contiene ejemplos de cómo convertir un datetimeoffset valor a una fecha valor en SQL Server.

El desplazamiento de fecha y hora el tipo de datos incluye la fecha y la hora con un desplazamiento de zona horaria. También tiene una parte de segundos fraccionarios entre 0 y 7 (esto depende de cuántos segundos fraccionarios se le asignen). Esto se hace usando datetimeoffset(n) sintaxis. Si no especifica esto, usará 7 (el valor predeterminado). El tamaño de almacenamiento de este tipo de datos es de 8, 9 o 10 bytes (más 1 byte para almacenar la precisión), según la precisión que se utilice. Su precisión es de 100 nanosegundos.

La fecha tipo de datos por otro lado, solo incluye la fecha. No incluye la hora y tiene una precisión de 1 día. Utiliza 3 bytes para el almacenamiento.

Cuando convierte un datetimeoffset valor a una fecha tipo de datos, pierde la parte de la hora (incluida la compensación de la zona horaria). Sin embargo, también reduce el tamaño de almacenamiento a 3 bytes fijos. Por supuesto, solo haría esta conversión si no necesita la parte horaria y la compensación de la zona horaria.

Ejemplo 1:conversión implícita

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedate date;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thedate = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedate AS 'date';

Resultado:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

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

Aquí podemos ver que la fecha el valor solo incluye la fecha (sin el componente de hora). El componente de tiempo, incluida su compensación de zona horaria, se ha eliminado del valor.

En este ejemplo, el datetimeoffset El valor utiliza la precisión predeterminada (que da como resultado 7 lugares decimales). Esto da como resultado que el tipo de datos use 10 bytes (en realidad, 11 bytes si cuenta el byte adicional que almacena la precisión). La fecha El valor usa solo 3 bytes.

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

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

Resultado:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

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 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(date, @thedatetimeoffset) AS 'date';

Resultado:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+