Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Modifier le décalage de fuseau horaire sur une valeur datetimeoffset dans SQL Server (T-SQL)

Vous pouvez utiliser le SWITCHOFFSET() fonction dans SQL Server pour modifier le décalage de fuseau horaire sur un datetimeoffset valeur.

La fonction accepte deux arguments ; un datetimeoffset(n) value (ou une expression qui peut être résolue en un datetimeoffset(n) valeur) et le nouveau fuseau horaire.

Exemple

Voici un exemple pour illustrer.

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

Résultat (en utilisant la sortie verticale) :

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

Notez que le décalage de fuseau horaire est spécifié sous forme de chaîne. C'est parce que je l'ai fourni en heures.

Lorsqu'il est spécifié en heures, le décalage de fuseau horaire doit utiliser le format [+|-]TZH:TZM et être spécifié sous forme de chaîne (entre guillemets simples).

Utiliser les minutes comme décalage de fuseau horaire

Vous pouvez également spécifier le décalage horaire en minutes. Lorsque vous faites cela, vous devez le spécifier sous la forme d'un entier.

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

Résultat (en utilisant la sortie verticale) :

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

Exemple de base de données

Voici un exemple d'utilisation de SWITCHOFFSET() sur la valeur d'une colonne dans une table de base de données.

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;

Résultat (en utilisant la sortie verticale) :

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

Performances lors de l'utilisation d'une valeur GETDATE()

Microsoft conseille d'utiliser SWITCHOFFSET() avec le GETDATE() La fonction peut ralentir l'exécution de la requête, car l'optimiseur de requête n'est pas en mesure d'obtenir des estimations de cardinalité précises pour la datetime valeur.

Pour résoudre ce problème, utilisez l'OPTION (RECOMPILE) indice de requête. Cela oblige l'optimiseur de requête à recompiler un plan de requête la prochaine fois que la même requête est exécutée.

Vous ne connaissez pas le décalage horaire ?

Si vous ne connaissez pas le décalage horaire à utiliser, voici comment obtenir une liste des fuseaux horaires pris en charge dans SQL Server.

Une chose dont vous devez tenir compte est l'heure d'été. De nombreux pays/régions ont leurs propres règles spécifiques pour observer l'heure d'été (et certains ne l'observent pas du tout). Cela peut causer toutes sortes de problèmes lorsque vous essayez de déterminer si vous devez ou non prendre en compte l'heure d'été dans vos décalages de fuseau horaire.

Heureusement, SQL Server a trouvé un moyen de gérer cela. SQL Server 2016 a introduit le AT TIME ZONE clause. Cette clause vous permet de spécifier le nom d'un fuseau horaire, plutôt que le décalage horaire lui-même. Par conséquent, vous pouvez simplement utiliser "US Mountain Standard Time" ou "India Standard Time" ou n'importe quel fuseau horaire applicable.

Voir Convertir une date dans un autre fuseau horaire pour des exemples sur la façon de procéder.