2011-05-04 19 views
9

Estamos utilizando la base de datos Oracle.Oracle current_timestamp to seconds conversion

En nuestra marca de tiempo tabla se almacena como segundo desde 1970, ¿cómo puedo convertir la marca de tiempo obtenida a través de la función current_timestamp() a segundos

+0

posible duplicado de [Oracle SQL - Columna con marca de tiempo Unix, necesita marca de tiempo-mm-aaaa dd] (http://stackoverflow.com/questions/2401396/oracle-sql- column-with-unix-timestamp-need-dd-mm-yyyy-timestamp) – APC

Respuesta

21

Esto lo haría:

select (cast(current_timestamp as date) - date '1970-01-01')*24*60*60 from dual 

A pesar de que wouldn' t uso current_timestamp si estaba interesado sólo en cuestión de segundos, me gustaría utilizar SYSDATE:

select (SYSDATE - date '1970-01-01')*24*60*60 from dual 
+4

Agregaría 'ROUND()' alrededor de eso; de lo contrario, puede obtener un resultado como '1425030807.000000000000000000000000000004'. Además, ¿no todos saben que hay 86,400 segundos en un día? ;) –

+1

Advertencia: la hora de Unix es GMT/UTC y Oracle sysdate es la hora local. Entonces no estoy seguro si esta solución será exacta – ropata

0

No tan preciosa solution pero quizá con algún advan Tages.

0

Quizás no del todo relevante. Tuve que resolver otro problema (por ejemplo, Oracle almacena la marca de tiempo en V $ RMAN_STATUS y V $ RMAN_OUTPUT) y tuve que convertirlo en fecha/hora. Me sorprendió, pero la fecha mágica no es 1970-01-01 allí, sino 1987-07-07. Miré la historia de Oracle y la fecha más cercana que se me ocurre es cuando transfirieron productos de Oracle a UNIX. ¿Es esto correcto?

Aquí es mi SQL

SELECT /*+ rule */ 
     to_char(min(stamp)/(24*60*60) + date '1987-07-07', 'DD-MON-YYYY HH24:MI:SS') start_tm 
     , to_char(to_char(max(stamp)/(24*60*60) + date '1987-07-07', 'DD-MON HH24:MI:SS')) end_tm 
FROM V$RMAN_STATUS 
START WITH (RECID, STAMP) = 
    (SELECT MAX(session_recid),MAX(session_stamp) FROM V$RMAN_OUTPUT) 
CONNECT BY PRIOR RECID = parent_recid ; 
Cuestiones relacionadas