SQL Server 2008 - Comment faire pour convertir GMT(UTC) datetime locales datetime?
J'ai un insert proc qui passe dans GETDATE()
comme l'une des valeurs parce que chacun d'insérer également des magasins quand il a été inséré. Ce est hébergé sur SQL Azure, qui est à l'heure GMT.
Maintenant, quand je reçois des messages, j'ai la date GMT enregistrées pour chacun d'entre eux dans leurs colonnes timestamp, comment puis-je convertir ce local datetime
l'endroit où vous vous trouvez lorsque vous accédez à ma page?
Grâce.
A l'heure du serveur de changement? Pouvez-vous vérifier?
Euh, il est en cours d'exécution sur SQL Azure. Comment pourrais-je le vérifier?
ne pouvez pas vous contenter de faire un "SELECT GETDATE() GO" et voir si cela correspond à ce que vous attendez?
Vous ne pouvez pas Azure devrait être en cours d'exécution de l'heure GMT. Êtes-vous d'obtenir que ou un local de temps?
quand vous dites "quand j'exécute des requêtes simples dans Azure, il ne fonctionne pas bien" qu'entendez-vous par "ne fonctionne pas"?
Euh, il est en cours d'exécution sur SQL Azure. Comment pourrais-je le vérifier?
ne pouvez pas vous contenter de faire un "SELECT GETDATE() GO" et voir si cela correspond à ce que vous attendez?
Vous ne pouvez pas Azure devrait être en cours d'exécution de l'heure GMT. Êtes-vous d'obtenir que ou un local de temps?
quand vous dites "quand j'exécute des requêtes simples dans Azure, il ne fonctionne pas bien" qu'entendez-vous par "ne fonctionne pas"?
OriginalL'auteur slandau | 2011-05-19
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire quelque chose comme ceci:
ou
vous avez raison à propos de la limitation de cette approche. Cependant, je ne pensent pas qu'il est incorrect. Cela dépend de ce que vous essayez d'atteindre.
Essayer d'obtenir le bon temps de retour pour un fuseau horaire local, compte tenu de l'arbitraire d'un moment de l'entrée?
Pour gérer l'heure d'été conversions, vous aurez besoin d'une table de recherche comme ceci: codeproject.com/Articles/14769/...
@Wasabi explique, cette approche ne fonctionnera pas. Elle suppose que l'heure locale du serveur qui a toujours eu le même décalage par rapport à l'heure GMT/UTC - même pour Greenwich, ce n'est pas vrai, en raison de l'heure d'été!
OriginalL'auteur
En dehors de la Lumière du jour d'Épargne question, pourquoi ne pas simplifier avec:
OriginalL'auteur
Pour MST comme un exemple... considérant chaque DTM est stocké dans GMT déjà, cela simplifie les choses..
Maintenant, si votre local de date/heure est autre chose que l'heure GMT/UTC, vous aurez probablement envie d'utiliser les éléments suivants...
En voici le détail.
SWITCHOFFSET
- convertit une valeur DateTimeOffset à un autre fuseau horaire, tout en préservant le décalage.TODATETIMEOFFSET
- convertit une valeur de type DateTime DateTimeOffset valeur à un fuseau horaire.DATEPART
- dans ce cas est de mettre le fuseau horaire locaux de l'datetime.'+00:00'
- de l'objectif de compenser, dans le deuxième exemple est UTC/GMT cible, locale... l'exemple précédent de MST.NOTE/AVERTISSEMENT: je ne crois pas que cela représente pour l'Heure, ce qui pourrait être un problème pour vous. Si absolue de conservation n'est pas nécessaire, vous pouvez simplement ajouter une deuxième colonne, avec la rudesse de la conversion et aller de l'avant en toute sécurité.
Vous souhaitez peut-être abstraites de la logique dans un appel de fonction, afin de tenir compte de la préservation de l'heure d'été... il ne devrait pas être trop difficile à faire, cependant.
OriginalL'auteur
Voici une fonction qui travaille sur des données historiques. Je l'ai écrit pour British Summer time - qui, malheureusement, se produit le dernier dimanche du mois de Mars et d'octobre, faisant de la logique un peu alambiqué.
Fondamentalement la date codée en dur partie 01/03 est à la recherche pour le dernier dimanche de Mars et le 01/10 est à la recherche pour le dernier dimanche d'octobre (qui est quand les horloges aller de l'avant et à l'arrière ici). REMARQUE: SI VOTRE SERVEUR utilise NATIF de DATES aux etats-unis INVERSER CES DEUX PIÈCES AU 03/01 et du 10/01!!!!
Si vous lui donnez une date UTC et il va automatiquement si une date historique est cest ou GMT. Pas la meilleure chose à utiliser sur un grand ensemble de données, mais c'est une solution.
Exécuter ce script pour créer la fonction et de l'appeler en ligne dans votre sélection. SQL 2008 a un problème avec les fonctions définies par l'utilisateur, il me semble, elle met un redline en vertu du code, mais il fonctionne encore comme longtemps que vous utilisez la dbo préfixe (SELECT dbo.UTCConvert(yourdate) pour l'exécuter)
OriginalL'auteur