Je fais quelques requêtes SQL et je voudrais convertir ma colonne UTC datetime en heure locale pour l'afficher en tant qu'heure locale dans mes résultats de requête. Remarque, je ne cherche PAS à effectuer cette conversion via du code mais plutôt lorsque je fais des requêtes SQL manuelles et aléatoires sur mes bases de données.
sql
sql-server
Nugs
la source
la source
Réponses:
Vous pouvez le faire comme suit sur SQL Server 2008 ou supérieur:
Vous pouvez également faire le moins verbeux:
Quoi que vous fassiez, ne l' utilisez pas
-
pour soustraire des dates, car l'opération n'est pas atomique, et vous obtiendrez parfois des résultats indéterminés en raison de conditions de concurrence entre le système datetime et le local datetime vérifiés à des moments différents (c'est-à-dire non atomiquement) .Veuillez noter que cette réponse ne prend pas en compte l'heure d'été. Si vous souhaitez inclure un ajustement d'heure d'été, veuillez également consulter la question SO suivante:
Comment créer la fonction de début et de fin de l'heure d'été dans SQL Server
la source
Je n'ai trouvé aucun de ces exemples utiles pour obtenir un datetime stocké en UTC à un datetime dans un fuseau horaire spécifié (PAS le fuseau horaire du serveur car les bases de données Azure SQL s'exécutent en UTC). C'est ainsi que je l'ai géré. Ce n'est pas élégant mais c'est simple et vous donne la bonne réponse sans conserver d'autres tableaux:
la source
AT TIME ZONE
syntaxe, pensez à stackoverflow.com/a/44941536/112764 - vous pouvez enchaîner plusieurs conversions en concaténant simplement plusieursat time zone <blah>
s.dateTimeField AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
- enchaînant simplement lesAT TIME ZONE
instructions. (@NateJ l'a mentionné ci-dessus, je vois maintenant)Si votre heure locale est indiquée
Eastern Standard Time
et que vous souhaitez convertir de l'UTC en cela, alors dans Azure SQL et SQL Server 2016 et versions ultérieures , vous pouvez faire:La liste complète des noms de fuseau horaire peut être trouvée avec:
Et oui, les fuseaux horaires sont mal nommés - même si c'est le cas
Eastern Standard Time
, l'heure d'été est prise en compte.la source
Si vous avez besoin d'une conversion autre que l'emplacement de votre serveur, voici une fonction qui vous permet de passer un décalage standard et qui prend en compte l'heure d'été américaine:
la source
Utilisation de nouvelles opportunités SQL Server 2016:
Mais la procédure clr fonctionne 5 fois plus vite: '- (
Faites attention à ce que le décalage pour une zone horaire puisse changer en heure d'hiver ou d'été. Par exemple
résultats:
Vous ne pouvez pas simplement ajouter un décalage constant.
la source
Si l'activation de CLR sur votre base de données est une option ainsi que l'utilisation du fuseau horaire du serveur SQL, il peut être écrit en .Net assez facilement.
Une valeur datetime UTC entre et la valeur datetime locale relative au serveur sort. Les valeurs nulles renvoient null.
la source
Il n'y a pas de moyen simple de le faire de manière correcte ET générique.
Tout d'abord, il faut comprendre que le décalage dépend de la date en question, du fuseau horaire ET de l'heure d'été.
GetDate()-GetUTCDate
vous donne seulement le décalage aujourd'hui au TZ du serveur, ce qui n'est pas pertinent.Je n'ai vu que deux solutions de travail et j'ai beaucoup cherché.
1) Une fonction SQL personnalisée avec quelques tables de données de base telles que les fuseaux horaires et les règles DST par TZ. Fonctionne mais pas très élégant. Je ne peux pas le poster car je ne possède pas le code.
EDIT: Voici un exemple de cette méthode https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) Ajoutez un assemblage .net à la base de données, .Net peut le faire très facilement. Cela fonctionne très bien mais l'inconvénient est que vous devez configurer plusieurs paramètres au niveau du serveur et la configuration est facilement interrompue, par exemple si vous restaurez la base de données. J'utilise cette méthode mais je ne peux pas la poster car je ne possède pas le code.
la source
Rien de tout cela n'a fonctionné pour moi, mais cela ci-dessous a fonctionné à 100%. J'espère que cela peut aider les autres à essayer de le convertir comme je l'ai été.
la source
declare @StandardOffset int = datediff (hh, GETUTCDATE(), GETDATE())
Voici une version qui tient compte de l'heure d'été, du décalage UTC et n'est pas verrouillée sur une année particulière.
la source
J'ai trouvé que la fonction unique était trop lente lorsqu'il y avait beaucoup de données. Je l'ai donc fait en joignant une fonction de table qui permettrait de calculer le différentiel horaire. Il s'agit essentiellement de segments datetime avec le décalage horaire. Une année serait de 4 rangées. Donc, la fonction de table
retournerait ce tableau:
Il tient compte de l'heure d'été. Un exemple de la façon dont il est utilisé est ci-dessous et l'article de blog complet est ici .
la source
la source
La réponse de Ron contient une erreur. Il utilise 2:00 AM heure locale où l'équivalent UTC est requis. Je n'ai pas assez de points de réputation pour commenter la réponse de Ron, donc une version corrigée apparaît ci-dessous:
la source
L'horodatage UNIX est simplement le nombre de secondes entre une date particulière et l'époque Unix,
SELECT DATEDIFF (SECOND, {d '1970-01-01'}, GETDATE ()) // Cela retournera l'horodatage UNIX dans le serveur SQL
vous pouvez créer une fonction pour la conversion de l'heure locale en date UTC Unix UTC à l'aide de la fonction de décalage du pays vers l'horodatage Unix dans le serveur SQL
la source
C'est simple. Essayez ceci pour Azure SQL Server:
Pour Local SQL Server:
la source
Pour les utilisateurs Azure SQL et
@@Version
> = SQL Server 2016, voici une fonction simple à utiliserAT TIME ZONE
.Pour les types de valeurs qui
@LocalTimeZone
peuvent prendre, veuillez cliquer sur ce lien ou surKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
la source
Comme avertissement - si vous allez utiliser ce qui suit (notez les millisecondes au lieu des minutes):
Gardez à l'esprit que la partie DATEDIFF ne renverra pas toujours le même numéro. Donc, ne l'utilisez pas pour comparer DateTimes en millisecondes.
la source
J'ai trouvé que cette fonction est plus rapide que d'autres solutions utilisant une table ou des boucles distinctes. C'est juste une déclaration de cas de base. Étant donné que tous les mois entre avril et octobre ont un décalage de -4 heures (heure de l'Est), nous devons simplement ajouter quelques lignes de cas supplémentaires pour les jours marginaux. Sinon, le décalage est de -5 heures.
Ceci est spécifique à une conversion de l'heure UTC en heure de l'Est, mais des fonctions de fuseau horaire supplémentaires peuvent être ajoutées au besoin.
la source
Cela devrait être en mesure d'obtenir l'heure du serveur avec l'heure d'été
sysdatetimeoffset prend en compte l'heure d'été
la source
Première fonction: configurée pour le fuseau horaire italien (+1, +2), changer les dates: dernier dimanche de mars et octobre, renvoyer la différence entre le fuseau horaire actuel et le datetime comme paramètre.
Le code est:
Ensuite, la fonction qui convertit la date
la source
- obtenir l'heure standard indienne d'utc
la source
Cela peut se faire sans fonction. Le code ci-dessous convertira une heure UTC en heure de la montagne en tenant compte de l'heure d'été. Ajustez tous les nombres -6 et -7 à votre fuseau horaire en conséquence (c'est-à-dire que pour EST, vous ajusteriez respectivement -4 et -5)
la source
Vous devez reformater la chaîne ainsi que la conversion à l'heure correcte. Dans ce cas, j'avais besoin de temps zoulou.
la source
Le meilleur moyen pour Oracle:
Avec datetime codé en dur:
Result:
2018-10-28 00:00
Avec les noms de colonne et de table:
la source
J'ai du code pour effectuer des heures UTC vers Local et Local vers UTC qui permet la conversion en utilisant un code comme celui-ci
et
Les fonctions peuvent prendre en charge tout ou partie des fuseaux horaires dans l'IANA / TZDB comme fourni par NodaTime - voir la liste complète sur https://nodatime.org/TimeZones
Sachez que mon cas d'utilisation signifie que je n'ai besoin que d'une fenêtre «actuelle», permettant la conversion des temps dans une fourchette d'environ +/- 5 ans à partir de maintenant. Cela signifie que la méthode que j'ai utilisée ne vous convient probablement pas si vous avez besoin d'une très longue période, en raison de la façon dont elle génère du code pour chaque intervalle de fuseau horaire dans une plage de dates donnée.
Le projet est sur GitHub: https://github.com/elliveny/SQLServerTimeConversion
Cela génère du code de fonction SQL selon cet exemple
la source
Eh bien, si vous stockez les données en tant que date UTC dans la base de données, vous pouvez faire quelque chose d'aussi simple que
c'était toujours local du point de vue du serveur et vous ne tentez pas avec AT
TIME ZONE 'your time zone name'
, si votre base de données est déplacée vers un autre fuseau horaire comme une installation client, un fuseau horaire codé en dur peut vous mordre.la source
En postgres, cela fonctionne très bien .. Indiquez au serveur l'heure à laquelle l'heure est enregistrée, «utc», puis demandez-lui de convertir en un fuseau horaire spécifique, dans ce cas «Brésil / Est»
Obtenez une liste complète des fuseaux horaires avec la sélection suivante;
Voir les détails ici.
https://popsql.com/learn-sql/postgresql/how-to-convert-utc-to-local-time-zone-in-postgresql
la source
En voici une plus simple qui tient compte de dst
la source
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), '20150101'), GETDATE())
. Je suis actuellement en CEST (UTC + 2), mais l'heure d'été ne sera pas en vigueur le jour du Nouvel An, donc la bonne réponse pour moi serait le 1er janvier 2015 à 01h00. Votre réponse, comme la réponse acceptée, renvoie le 1er janvier 2015 02:00.