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

Cambie el desplazamiento de la zona horaria en un valor datetimeoffset en SQL Server (T-SQL)

Puedes usar el SWITCHOFFSET() función en SQL Server para cambiar el desplazamiento de la zona horaria en un datetimeoffset valor.

La función acepta dos argumentos; un desplazamiento de fecha y hora (n) valor (o una expresión que se puede resolver en datetimeoffset(n) valor) y la nueva zona horaria.

Ejemplo

Aquí hay un ejemplo para demostrarlo.

DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, '+04:00') AS [Modified];

Resultado (usando salida vertical):

Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Tenga en cuenta que el desplazamiento de la zona horaria se especifica como una cadena. Esto se debe a que lo proporcioné en horas.

Cuando se especifica en horas, el desplazamiento de la zona horaria debe usar el formato [+|-]TZH:TZM y especificarse como una cadena (entre comillas simples).

Usar minutos como compensación de zona horaria

Como alternativa, puede especificar el desplazamiento de la zona horaria en minutos. Al hacer esto, debe especificarlo como un número entero.

DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, 240) AS [Modified];

Resultado (usando salida vertical):

Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Ejemplo de base de datos

Aquí hay un ejemplo del uso de SWITCHOFFSET() en el valor de una columna en una tabla de base de datos.

CREATE TABLE Test 
  (
      Col1 datetimeoffset
  ); 
INSERT INTO Test   
VALUES ('1967-12-20 17:33:59.8900000 -07:00'); 
SELECT 
  Col1,
  SWITCHOFFSET(Col1, '-08:00') AS Modified
FROM Test;

Resultado (usando salida vertical):

Col1     | 1967-12-20 17:33:59.8900000 -07:00
Modified | 1967-12-20 16:33:59.8900000 -08:00

Rendimiento cuando se usa un valor GETDATE()

Microsoft aconseja que el uso de SWITCHOFFSET() con GETDATE() puede hacer que la consulta se ejecute lentamente, debido a que el optimizador de consultas no puede obtener estimaciones de cardinalidad precisas para la fecha y hora valor.

Para resolver este problema, use la OPTION (RECOMPILE) sugerencia de consulta. Esto obliga al optimizador de consultas a volver a compilar un plan de consulta la próxima vez que se ejecute la misma consulta.

¿No sabe la compensación de la zona horaria?

Si no conoce la compensación de zona horaria que debe usar, aquí le indicamos cómo obtener una lista de las zonas horarias admitidas en SQL Server.

Una cosa que debe tener en cuenta es el horario de verano. Muchos países/regiones tienen sus propias reglas específicas para observar el horario de verano (y algunos no lo cumplen en absoluto). Esto puede causar todo tipo de problemas cuando intenta determinar si debe o no tener en cuenta el horario de verano en las compensaciones de su zona horaria.

Afortunadamente, a SQL Server se le ocurrió una manera de lidiar con esto. SQL Server 2016 introdujo el AT TIME ZONE cláusula. Esta cláusula le permite especificar el nombre de una zona horaria, en lugar del desplazamiento de la zona horaria en sí. Por lo tanto, simplemente puede usar la "hora estándar de las montañas de EE. UU." o la "hora estándar de la India" o la zona horaria que corresponda.

Consulte Convertir una fecha en otra zona horaria para ver ejemplos de cómo hacerlo.