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

Ejemplos de conversión de 'fecha' a 'datetimeoffset' en SQL Server (T-SQL)

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

Cuando conviertes una fecha valor a datetimeoffset , se agrega información adicional al valor. Esto se debe a que datetimeoffset El tipo de datos contiene información de fecha y hora, así como información de compensación de tiempo. En otras palabras, el datetimeoffset tipo de datos define una fecha que se combina con una hora de un día que tiene reconocimiento de zona horaria y se basa en un reloj de 24 horas. La fecha el tipo de datos, por otro lado, solo contiene información de fecha.

Cuando convertimos desde fecha a datetimeoffset , la hora (y el desplazamiento de la zona horaria) se agrega automáticamente al valor. Sin embargo, siempre puede cambiar el valor si es necesario (incluido el desplazamiento de la zona horaria).

El desplazamiento de fecha y hora El tipo de datos también le permite especificar la precisión de segundos fraccionarios. Si no especifica esto, usa una escala de 7. Esto significa que incluirá 7 dígitos en el lado derecho del punto decimal.

Ejemplo 1:conversión implícita

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

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00: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 entre bastidores cuando intentamos asignar la fecha valor a un datetimeoffset variables.

Podemos ver que la fecha La variable solo contiene información de fecha, mientras que datetimeoffset La variable contiene información de compensación de fecha, hora y zona horaria.

Cuando convierte entre fecha y datetimeoffset(7) (es decir, utilizando una escala de 7), el componente de tiempo se establece en 00:00:00.0000000 +00:00 . Este también es el valor predeterminado, por lo que puede omitir el valor de precisión y utilizará una escala de 7 (lo que da como resultado una precisión de 34). Puede reducir la precisión si lo prefiere. Reducir la precisión también puede reducir la cantidad de espacio necesario para almacenar el valor.

Para que quede claro, escala es el número de dígitos a la derecha del punto decimal en un número. Precisión es el número total de dígitos en el número.

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

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

Entonces obtenemos el mismo resultado que la conversión implícita.

También podemos ajustar el tiempo así:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Tenga en cuenta que no puede usar el DATEADD() función para modificar el componente de desfase horario. Pero no te preocupes, hay una forma de modificarlo (sigue leyendo para saber cómo).

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 @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetimeoffset, @thedate) AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

Y ajustando la hora:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Ejemplo 4:modificar la compensación de tiempo

En los ejemplos anteriores usamos el DATEADD() Función para modificar el valor del tiempo. Esta función se puede utilizar para modificar cualquier parte del componente de fecha u hora, excepto el componente de compensación de tiempo .

Si necesita modificar el desplazamiento de tiempo, puede usar el TODATETIMEOFFSET() función. También puede usar esta función para convertir la fecha original valor a un datetimeoffset valor. Esta función acepta un valor de fecha (que puede resolverse en datetime2 valor) y un valor de compensación.

He aquí un ejemplo:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00')
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

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

DECLARE @thedate date = '2020-12-01'
SELECT 
  @thedate AS 'date',
  TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';

Resultado:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

El TODATETIMEOFFSET() la función también acepta un datetimeoffset valor como su primer parámetro, por lo que también puede usarlo para modificar datetimeoffset existente valores si es necesario.

Ejemplo:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Resultado:

+------------+------------------------------------+------------------------------------+
| date       | datetimeoffset                     | Modified                           |
|------------+------------------------------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+------------------------------------+