2009-07-21 7 views
34

Probablement un classique ... Connaîtriez-vous une astuce facile pour récupérer une valeur UTC de SYSDATE sur Oracle (le mieux serait de faire fonctionner quelque chose sur la 8ème version).Comment obtenir la valeur UTC pour SYSDATE sur Oracle

Pour l'instant j'ai fonction personnalisée :(

Cheers,

Stefan

Répondre

30

Vous pouvez utiliser

SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00 -02:00') FROM DUAL; 

Vous devrez peut-être changer votre fuseau horaire

ALTER SESSION SET TIME_ZONE = 'Europe/Berlin'; 

Ou lire

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM dual; 
+1

Eh bien, l'astuce consiste à convertir SYSDATE. Donc, vous devrez d'abord établir en quelque sorte ce qu'est SESSIONTIMEZONE, et utiliser cette connaissance pour obtenir la valeur de décalage pour SYS_EXTRACT_UTC - n'est-ce pas? – stic

+0

Oui, vous pouvez consulter ce lien depuis Oracle où les paramètres de fuseau horaire et de fuseau horaire: http://www.oracle.com/technology/obe/obe9ir2/obe-nls/datetime/datetime.htm – Jonathan

+1

J'ai étendu la réponse en raison de un bug subtil. –

32
select sys_extract_utc(systimestamp) from dual; 

ne fonctionnera pas sur Oracle 8, cependant.

19

Habituellement, je travaille avec les colonnes DATE, pas le TIMESTAMP plus grand mais plus précis.

Ce qui suit va retourner la date UTC actuelle comme cela - une DATE. Travailler avec les dates UTC est super car je n'ai pas à m'inquiéter de la complexité des fuseaux horaires. Seul l'affichage final à l'utilisateur nécessite des décalages ou d'autres problèmes.

+0

J'ai essayé de comparer deux dates avec ceci (égal à) et n'obtenait pas les résultats attendus donc je pense qu'il y a encore un composant temps retourné. Qu'est-ce que le travail a été pour moi en utilisant l'instruction TRUNC: Sélectionnez * à partir du poste où TRUNC (Create_Date) = ( Select TRUNC (sys_extract_utc (SYSTIMESTAMP)) De DUAL) – DaveK

+2

colonnes DATE ne comprennent une composante de temps avec une précision à une seconde. Ils diffèrent des colonnes TIMESTAMP en ce que TIMESTAMP enregistre une précision supérieure à une seconde. En effet, ajouter TRUNC à ce qui précède est ce que vous voulez faire si vous voulez tronquer le composant temps. –

1

Si vous voulez un horodatage au lieu d'une date avec sysdate, vous pouvez spécifier un fuseau horaire à l'aide SYSTIMESTAMP:

select systimestamp at time zone 'UTC' from dual 

sorties: 29-AUG-17 06.51.14.781998000 PM UTC

Questions connexes