2009-07-21 20 views
34

Probablemente un clásico ... ¿Conoces un truco sencillo para recuperar un valor UTC de SYSDATE en Oracle (lo mejor sería obtener algo que también funcione en la 8ª versión).Cómo obtener el valor UTC para SYSDATE en Oracle

Por ahora tengo función personalizada :(

Cheers,

Stefan

Respuesta

30

Puede utilizar

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

También es posible que tenga que cambiar su zona horaria

ALTER SESSION SET TIME_ZONE = 'Europe/Berlin'; 

O leyó

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM dual; 
+1

Bueno, el truco es convertir de SYSDATE. Entonces, primero deberá establecer de alguna manera qué es SESSIONTIMEZONE, y usar ese conocimiento para obtener el valor de compensación para SYS_EXTRACT_UTC, ¿no es así? – stic

+0

Sí, se puede comprobar este enlace de Oracle, donde de fecha y hora y parámetros de zona horaria: http://www.oracle.com/technology/obe/obe9ir2/obe-nls/datetime/datetime.htm – Jonathan

+1

que han extendido la respuesta debido a la un error sutil. –

32
select sys_extract_utc(systimestamp) from dual; 

no funcionará en Oracle 8, sin embargo.

19

Por lo general, trabajo con columnas DATE, TIMESTAMP no es el más grande pero más preciso.

Lo siguiente devolverá la fecha UTC actual como solo eso - una FECHA.

CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) 

Trabajar con fechas UTC es excelente porque no tengo que preocuparme por la complejidad de las zonas horarias. Solo la visualización final para el usuario necesita compensaciones u otros problemas.

+0

Traté de comparar 2 fechas con esto (es igual) y no estaba obteniendo los resultados esperados, así que creo que todavía hay un componente de tiempo devuelto. Lo que funcionó para mí fue utilizar la instrucción TRUNC: Seleccionar * Del elemento donde TRUNC (Create_Date) = ( Seleccionar TRUNC (sys_extract_utc (SYSTIMESTAMP)) de DUAL) – DaveK

+2

Las columnas de FECHA incluyen un componente de tiempo con precisión de un segundo. Se diferencian de las columnas TIMESTAMP en que TIMESTAMP almacena una precisión superior a un segundo. De hecho, agregar TRUNC a lo anterior es lo que desea hacer si desea truncar el componente de tiempo. –

1

Si desea una marca de tiempo en lugar de sólo un día con sysdate, se puede especificar una zona horaria usando systimestamp:

select systimestamp at time zone 'UTC' from dual 

salidas: 29-AUG-17 06.51.14.781998000 PM UTC

Cuestiones relacionadas