J'utilise actuellement ce qui suit pour obtenir un datetime local à partir d'un datetime UTC:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Mon problème est que si l'heure d'été se produit entre GetUTCDate()
et @utcDateTime
, cela @localDateTime
se termine par une heure de repos.
Existe-t-il un moyen simple de convertir l'utc en heure locale pour une date qui n'est pas la date actuelle?
J'utilise SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. Certains environnements ne le permettent pas comme AWS RDS. Et c'est, eh bien, dangereux. Malheureusement, il n'y a pas d'implémentation complète du fuseau horaire .Net utilisable sansunsafe
autorisation. Voir ici et ici .J'ai développé et publié le projet T-SQL Toolbox sur codeplex pour aider quiconque éprouve des difficultés avec la gestion du datetime et du fuseau horaire dans Microsoft SQL Server. C'est open source et totalement gratuit à utiliser.
Il offre des UDF de conversion datetime faciles en utilisant du T-SQL simple (pas de CLR) en plus des tableaux de configuration préremplis prêts à l'emploi. Et il a une prise en charge complète de l'heure d'été (DST).
Une liste de tous les fuseaux horaires pris en charge se trouve dans le tableau "DateTimeUtil.Timezone" (fourni dans la base de données T-SQL Toolbox).
Dans votre exemple, vous pouvez utiliser l'exemple suivant:
Cela renverra la valeur datetime locale convertie.
Malheureusement, il est pris en charge pour SQL Server 2008 ou version ultérieure uniquement en raison de nouveaux types de données (DATE, TIME, DATETIME2). Mais comme le code source complet est fourni, vous pouvez facilement ajuster les tables et les FDU en les remplaçant par DATETIME. Je n'ai pas de MSSQL 2005 disponible pour les tests, mais il devrait également fonctionner avec MSSQL 2005. En cas de questions, faites le moi savoir.
la source
J'utilise toujours cette commande TSQL.
C'est très simple et ça fait l'affaire.
la source
J'ai trouvé cette réponse sur StackOverflow qui fournit une fonction définie par l'utilisateur qui semble traduire avec précision les heures
La seule chose que vous devez modifier est la
@offset
variable en haut pour la définir sur le décalage de fuseau horaire du serveur SQL exécutant cette fonction. Dans mon cas, notre serveur SQL utilise EST, qui est GMT - 5Ce n'est pas parfait et ne fonctionnera probablement pas dans de nombreux cas, comme les décalages TZ d'une demi-heure ou de 15 minutes (pour ceux que je recommanderais une fonction CLR comme Kevin recommandé ), mais cela fonctionne assez bien pour la plupart des fuseaux horaires génériques du Nord. Amérique.
la source
Pour SQL Server 2016+, vous pouvez utiliser AT TIME ZONE . Il gérera automatiquement l'heure d'été.
la source
Il y a quelques bonnes réponses à une question similaire posée sur Stack Overflow. J'ai fini par utiliser une approche T-SQL de la deuxième réponse de Bob Albright pour nettoyer un gâchis causé par un consultant en conversion de données.
Cela a fonctionné pour presque toutes nos données, mais j'ai ensuite réalisé que son algorithme ne fonctionnait que pour des dates remontant au 5 avril 1987 et que nous avions des dates des années 40 qui ne se convertissaient toujours pas correctement. Nous avons finalement eu besoin des
UTC
dates de notre base de données SQL Server pour nous aligner sur un algorithme dans un programme tiers qui utilisait l'API Java pour effectuer une conversion deUTC
l'heure locale à l'heure locale.J'aime l'
CLR
exemple de la réponse de Kevin Feasel ci-dessus en utilisant l'exemple de Harsh Chawla, et j'aimerais également le comparer à une solution qui utilise Java, car notre frontal utilise Java pour effectuer laUTC
conversion en heure locale.Wikipédia mentionne 8 modifications constitutionnelles différentes qui impliquent des ajustements de fuseau horaire avant 1987, et bon nombre d'entre elles sont très localisées dans différents États, il est donc possible que le CLR et Java les interprètent différemment. Votre code d'application frontale utilise-t-il dotnet ou Java, ou les dates antérieures à 1987 sont-elles un problème pour vous?
la source
Vous pouvez facilement le faire avec une procédure stockée CLR.
Vous pouvez stocker les TimeZones disponibles dans une table:
Et cette procédure stockée remplira le tableau avec les fuseaux horaires possibles sur votre serveur.
la source
WITH PERMISSION_SET = UNSAFE
. Certains environnements ne le permettent pas comme AWS RDS. Et c'est, eh bien, dangereux. Malheureusement, il n'y a pas d'implémentation complète du fuseau horaire .Net utilisable sansunsafe
autorisation. Voir ici et ici .SQL Server version 2016 résoudra ce problème une fois pour toutes . Pour les versions antérieures, une solution CLR est probablement la plus simple. Ou pour une règle DST spécifique (comme aux États-Unis uniquement), une fonction T-SQL peut être relativement simple.
Cependant, je pense qu'une solution générique T-SQL pourrait être possible. Tant que
xp_regread
ça marche, essayez ceci:Une fonction T-SQL (complexe) pourrait utiliser ces données pour déterminer le décalage exact pour toutes les dates pendant la règle DST actuelle.
la source
la source
Voici une réponse écrite pour une application spécifique au Royaume-Uni et basée uniquement sur SELECT.
Non applicable entre minuit et 1 h du matin le jour, l'heure d'été commence. Cela pourrait être corrigé mais l'application pour laquelle il a été écrit ne l'exige pas.
la source