À 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?
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
Vous devez vous connecter pour publier un commentaire.
La première ligne de votre code contient la faute:
GETUTCDATE()
renvoie unedatetime
, qui n'a pas de décalage de fuseau horaire de l'information. Ainsi, comme décrit dans la documentation MSDN:Donc, même si vous avez récupéré l'heure UTC, vous avez affirmé à tort que la valeur était à Londres le temps (ce qui est UTC+1 heure d'été à cette date).
La façon la plus simple de résoudre ce problème est de simplement aller chercher l'heure UTC en tant que
datetimeoffset
pour commencer.Ce invoque le conversion fonctionnalité de
AT TIME ZONE
, qui dans les docs états:Considérer que si vos données proviennent en fait d'un
datetime
champ quelque part, vous pourriez avoir besoin d'utiliser les deux parties de la fonctionnalité, comme ceci:Le premier appel à
AT TIME ZONE
affirme la valeur est en UTC, donnant undatetimeoffset
à l'appel de la deuxième, qui le transforme en, heure de Londres.La sortie de l'un de ces est un
datetimeoffset
, vous pouvez diffuser ou de le convertir à unedatetime
oudatetime2
exactement comme vous l'a montré dans votre question initiale. (N'utilisez pas deswitchoffset
pour cela.)Aussi, le temps Windows identificateur de la zone de Londres est toujours
"GMT Standard Time"
. Il comprend à la fois le Temps Moyen de Greenwich et Britanniques de l'Heure d'Été, avec le cas échéant des transitions entre eux. N'essayez pas de le changer pour"GMT Daylight Time"
- que l'identifiant n'existe pas. C'est également couvert dans le fuseau horaire de la balise wiki, dans la section Windows de fuseaux horaires.SELECT CONVERT(datetime, SYSDATETIMEOFFSET() AT TIME ZONE 'GMT Standard Time')
. Merci pour la grande explication de trop.OriginalL'auteur Matt Johnson
Depuis que j'ai été incapable de trouver nulle part ailleurs je pensais que je voudrais partager. Vous pouvez obtenir le décalage en minutes datepart (tz) avec AU fuseau HORAIRE.
retourne
OriginalL'auteur Pete Thielen