À l'aide d'au fuseau HORAIRE pour obtenir l'heure actuelle dans le fuseau horaire spécifié

Je suis en train d'utiliser la nouvelle AU TEMPS de la ZONE de syntaxe dans SQL Server 2016 et SQL Azure. Je suis juste essayer d'obtenir l'heure actuelle à Londres en tant que datetime, ajusté en fonction de l'heure d'été. Au moment de l'exécution de toutes les commandes ci-dessous, le temps à Londres a été 3.27 suis.

La première étape est d'obtenir une datetimeoffset, je peux réussir à faire comme suit:

DECLARE @dto datetimeoffset
SET @dto = (SELECT GETUTCDATE() AT TIME ZONE 'GMT Standard Time')
SELECT @dto

Cela renvoie une valeur que j'attend:

2016-04-04 02:27:54.0200000 +01:00

Prochaine, je veux convertir un datetime, qui est ce que mes applications attendre. J'ai essayé trois approches différentes, dont aucune ne me donner le résultat, je suis à la recherche de:

SELECT SWITCHOFFSET(@dto,'+00:00')
-- Returns 2016-04-04 01:27:54.0200000 +00:00

SELECT CONVERT(datetime, @dto)
-- Returns 2016-04-04 02:27:54.020

SELECT CONVERT(datetime2, @dto)
-- Returns 2016-04-04 02:27:54.0200000

J'ai l'impression de rater quelque chose d'évident - est-il un moyen facile de prendre un datetimeoffset et revenir juste la date et l'heure de la partie à ce décalage?

Définir "ne fonctionnent pas". Les deux convertir déclarations semblent être en train de faire la bonne chose pour moi... Si vous essayez d'obtenir le retour d'03:27, pourquoi ne pas utiliser le Londres TZ au lieu de "GMT Standard time" lorsque vous définissez @dto?
Peut-être "ne marche pas" n'est pas tout à fait raison, et je vais régler la question de changer le libellé en question mais je voudrais avoir un moyen pour obtenir le retour à un datetime avec une valeur de 03:27. Il ne semble pas être un "Londres" fuseau horaire: GMT Heure Standard de l'est le fuseau horaire de Londres est en autant que je sache.
Je n'ai pas de SQL 2016 instance installé, donc je ne peux pas confirmer votre comportement. J'ai regardé le Registre Windows à TZ info et il semble que GMT n'a en effet observer l'heure d'été. Une chose que j'ai remarqué dans votre code, c'est que vous avez appelé getUTCdate() qui je m'attends à être le même partout (car il est Universel ant tous). Pour tester, essayez les trois choses 1) SELECT GETUTCDATE() AT TIME ZONE 'GMT Daylight Time' 2) SELECT GETUTCDATE() AT TIME ZONE 'Tokyo Standard Time' 3) SELECT GETDATE() AT TIME ZONE 'GMT Standard Time'
Je suis en train de faire cela sur Azure SQL, mais je crois que le comportement sera le même sur SQL 2016.
Les résultats sont: (1) - Msg 9820, Level 16, State 1, Line 1 The time zone parameter 'GMT Daylight Time' provided to AT TIME ZONE clause is invalid.; (2) - SELECT GETUTCDATE() AT TIME ZONE 'Tokyo Standard Time'; (3) 2016-04-04 06:00:25.583 +01:00. (Le temps que j'ai couru c'était 7h du matin à Londres.)

OriginalL'auteur John | 2016-04-04