TSQL: Comment faire pour convertir l'heure locale à l'UTC? (SQL Server 2008)
Nous avons affaire à une application qui doit gérer l'heure de différents fuseaux horaires et l'heure d'paramètres. L'idée est de stocker le tout dans format UTC interne et de convertir dans les deux sens pour l'utilisateur localisée interfaces. Le SQL Server offre des mécanismes pour gérer les traductions de temps donné, un pays et un fuseau horaire?
Ce doit être un problème commun, donc je suis surpris que google ne serait pas quelque chose d'utilisable.
Les pointeurs?
- J'ai mon mssql serveur lié à une base de données mysql-server. Je me demande si il est possible d'exécuter mysql CONVERT_TZ(temps,srczone,dstzone) sur les requêtes 🙂 Bizarre, cette fonction est manquante; il est intégré dans linux.
- Voir ma réponse ci-dessous. En fait, je pense que vous pouvez l'accepter même si c'est plus facile pour les autres de trouver.
- La réponse courte: il n'y a pas de façon de le faire avant de SQL Server 2016, donc il faudra un code personnalisé sur des versions antérieures.
- Le moyen de réponse: tous les temps de décalage de la fonctionnalité avant de SQL Server 2016 seulement travaillé avec absolue des compensations, sans aucun soutien pour la variable décalages qui se produisent dans la plupart des fuseaux horaires en raison de l'Heure d'été. Les requêtes n'ont aucun moyen d'accéder à des décalages temporels à l'exception de ce qui se passe pour être au courant de décalage de l'heure locale du serveur, ce qui est inutile pour essayer d'automatiser la conversion.
Vous devez vous connecter pour publier un commentaire.
7 ans sont passés et...
actuellement, il y a ce nouveau Serveur SQL 2016 fonctionnalité qui fait exactement ce dont vous avez besoin.
Elle est appelée AU MOMENT de la ZONE et il convertit la date pour un certain temps, la zone compte tenu de l'heure d'été (daylight saving time) des changements.
Plus d'infos ici:
https://msdn.microsoft.com/en-us/library/mt612795.aspx
Cela fonctionne pour les dates qui ont actuellement le même décalage UTC comme SQL Serveur hôte; il ne tient pas compte de modifications de l'heure d'été. Remplacer
YOUR_DATE
avec la date locale à convertir.SELECT DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), YOUR_DATE);
Tandis que quelques-uns de ces réponses, vous obtiendrez dans le stade, vous ne pouvez pas faire ce que vous essayez de faire avec l'arbitraire des dates pour sql server 2005 et versions antérieures raison de l'heure avancée. À l'aide de la différence entre le courant locale et UTC actuelle va me donner le décalage qui existe aujourd'hui. Je n'ai pas trouvé un moyen de déterminer le décalage aurait été pour la date en question.
Cela dit, je sais que sql server 2008 fournit quelques nouvelles fonctions de date susceptible de répondre à cette question, mais les gens à l'aide d'une version antérieure doivent être conscients des limites.
Notre approche est de persister UTC et effectuer la conversion sur le côté client où nous avons plus de contrôle sur la conversion de l'exactitude.
SQL Server 2008 est un type appelé
datetimeoffset
. C'est vraiment utile pour ce genre de choses.http://msdn.microsoft.com/en-us/library/bb630289.aspx
Ensuite, vous pouvez utiliser la fonction
SWITCHOFFSET
pour le déplacer d'un fuseau horaire à un autre, mais toujours en gardant la même valeur UTC.http://msdn.microsoft.com/en-us/library/bb677244.aspx
Rob
Vous pouvez utiliser mon SQL Server en charge des fuseaux horaires projet pour convertir entre IANA fuseaux horaires standard, comme indiqué ici.
UTC Locales est comme ceci:
Locaux de l'UTC est comme ceci:
Le nombre d'options sont le drapeau pour le contrôle du comportement lorsque les valeurs de temps sont touchés par l'heure d'été. Elles sont décrites en détail dans la documentation du projet.
Ici le code pour convertir une zone
DateTime
à une autre zoneDateTime
Note: Ce(
AT TIME ZONE
) de ne travailler que sur SQL Server 2016+ et cet avantage est automatiquement en considérant la Lumière du jour lors de la conversion de fuseau horaire particulierAT TIME ZONE
appels (phrases?) ensemble! Simplement élégant. Je l'ai dit plus tôt que stackoverflow.com/a/44579178/112764 satisfait mes besoins, mais c'est encore mieux. Grandes félicitations.DECLARE @UTCDateTime DATETIME = GETUTCDATE();
DECLARE @ConvertedZoneDateTime DATETIME;
-- 'UTC' to 'India Standard Time' to 'Eastern Standard Time' DATETIME
SET @ConvertedZoneDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' AT TIME ZONE 'Eastern Standard Time'
SELECT @UTCDateTime AS UTCDATE,@ConvertedZoneDateTime AS EasternStandardTime
Oui, vous pouvez enchaîner plusieursAT TIME ZONE
des appels, mais De et De est suffisant pour la conversion et la plupart nous avons besoinJ'ai tendance à pencher vers l'aide DateTimeOffset pour tous date-heure de stockage qui n'est pas liée à un événement local (ie: rencontre/partie, etc, 12h-3h du musée).
Pour récupérer les DTO que l'UTC:
NOTE: je vais toujours utiliser UTC lors de l'envoi sur le fil... côté client JS pouvez facilement obtenir/de la locale de l'UTC. Voir:
new Date().toJSON()
...Suivantes JS traitera de l'analyse d'une UTC/GMT date au format ISO8601 à un datetime local.
Oui, dans une certaine mesure, détaillée ici.
L'approche que j'ai utilisée (avant 2008) est de faire la conversion dans le .NET de la logique métier avant de l'insérer dans la DB.
Vous pouvez utiliser GETUTCDATE() fonction permettant d'obtenir UTC datetime
Probablement, vous pouvez sélectionner différence entre GETUTCDATE() et la fonction GETDATE() et utiliser cette différence afin d'ajuster vos dates à l'UTC
Mais je suis d'accord avec le message précédent, qu'il est beaucoup plus facile à contrôler droit datetime dans la couche de gestion (en .NET, par exemple).
Exemple d'utilisation:
Retourne: