2009-07-21 10 views
34

Probabilmente un classico ... Conoscerai un trucco semplice per recuperare un valore UTC di SYSDATE su Oracle (il massimo sarebbe ottenere anche il funzionamento dell'ottava versione).Come ottenere il valore UTC per SYSDATE su Oracle

Per ora ho funzione personalizzata :(

Cheers,

Stefan

risposta

30

È possibile utilizzare

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

Potrebbe anche essere necessario cambiare il fuso orario

ALTER SESSION SET TIME_ZONE = 'Europe/Berlin'; 

o leggere

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM dual; 
+1

Beh, il trucco è quello di convertire da SYSDATE. Quindi, per prima cosa sarà necessario stabilire quale sia SESSIONTIMEZONE e utilizzare tale conoscenza per ottenere il valore di offset per SYS_EXTRACT_UTC - non è vero? – stic

+0

Sì, è possibile controllare questo collegamento da oracle dove Datetime e Parametri fuso orario: http://www.oracle.com/technology/obe/obe9ir2/obe-nls/datetime/datetime.htm – Jonathan

+1

Ho esteso la risposta a causa di un bug subtile. –

32
select sys_extract_utc(systimestamp) from dual; 

non funziona su Oracle 8, però.

19

In genere, lavoro con le colonne DATE, non con il TIMESTAMP più grande ma più preciso.

Quanto segue restituirà la data UTC attuale proprio come quella: una DATA.

CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) 

Lavorare con le date UTC è ottimo perché non devo preoccuparmi della complessità dei fusi orari. Solo il display finale per l'utente ha bisogno di compensazioni o altri problemi.

+0

Ho provato a confrontare 2 date con questo (uguale) e non ho ottenuto i risultati attesi, quindi penso che ci sia ancora un componente temporale restituito. Che cosa ha funzionato per me stava usando l'istruzione TRUNC: Seleziona * Dall'elemento Dove TRUNC (Create_Date) = ( Seleziona TRUNC (sys_extract_utc (SYSTIMESTAMP)) Da DUAL) – DaveK

+2

Le colonne DATE includono un componente orario con precisione a un secondo. Differiscono dalle colonne TIMESTAMP in quanto TIMESTAMP memorizza una precisione superiore a un secondo. In effetti, aggiungere TRUNC a quanto sopra è ciò che si vuole fare se si vuole troncare il componente temporale. –

1

Se si desidera un timestamp invece di un appuntamento con sysdate, è possibile specificare un fuso orario utilizzando SYSTIMESTAMP:

select systimestamp at time zone 'UTC' from dual 

uscite: 29-AUG-17 06.51.14.781998000 PM UTC

Problemi correlati