2010-05-13 37 views
11

Quiero ser capaz de almacenar la hora actual en milisegundos en un campo de número de Oracle. ¿Cómo hago esto a través de una consulta?Oracle es equivalente a java System.currentTimeMillis()?

select systimestamp from dual; 

devuelve la marca de tiempo real. ¿Hay alguna forma de que pueda convertir esto en milisegundos de la misma manera que lo hace Java System.currentTimeMillis()?

+0

Algunos sugerencias útiles aquí: http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm –

Respuesta

6

La función Java devuelve la cantidad de milisegundos que han transcurrido desde un momento fijo en el tiempo. Esa hora es la medianoche del primer día de 1970 UTC, es decir, el inicio del horario de reloj de Unix.

La siguiente función hace lo mismo para PL/SQL. Resta la marca de tiempo actual del punto de inicio (donde ms = 1). Extrae los diversos componentes de tiempo y los convierte en segundos. Finalmente se multiplica todo por 1000 para obtener el valor en milisegundos:

create or replace function current_millisecs 
    return number 
is 
    base_point constant timestamp := to_timestamp('01-JAN-1970 00:00:00.000'); 
    now constant timestamp := systimestamp AT TIME ZONE 'UTC' ; 
begin 
    return (
        ((extract(day from (now-base_point)))*86400) 
       + ((extract(hour from (now-base_point)))*3600) 
       + ((extract(minute from (now-base_point)))*60) 
       + ((extract(second from (now-base_point)))) 
      ) * 1000; 
end; 
/

Si tiene activado Java en la base de datos puede que le resulte más sencillo para crear un procedimiento almacenado Java en su lugar:

create or replace function currentTimeMillis return number as 
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer'; 
/

Comparativa de los dos enfoques:

SQL> select currentTimeMillis as JAVA 
    2   , current_millisecs as PLSQL 
    3   , currentTimeMillis - current_millisecs as DIFF 
    4 from dual 
    5/

     JAVA  PLSQL  DIFF 
---------- ---------- ---------- 
1.2738E+12 1.2738E+12   0 

SQL> 

(mi agradecimiento a Simón Nickerson, que descubrió el error tipográfico en la versión anterior de mi función PL/SQL que produjo un resultado anómalo.)


Por cierto, si usted está interesado sólo en el momento de la centisegundo más cercano, Oracle tiene un built-in para ello: DBMS_UTILITY.GET_TIME().

+0

Hay 3600 segundos en una hora, no 3660. –

+0

@SimonNickerson - ¡Ah, eso lo explicaría! Gracias. – APC

+0

dependiendo de su configuración, es posible que necesite crear la marca de tiempo de base_point de la siguiente manera: to_timestamp ('1970-01-01 00: 00: 00.000', 'AAAA-MM-DD HH24: MI: SS.FF') – Vladimir

1
  • DB zona horaria agnóstico
  • con milisegundos
  • obras en XE
 
    function current_time_ms 
     return number 
    is 
     out_result number; 
    begin 
     select extract(day from(sys_extract_utc(systimestamp) - to_timestamp('1970-01-01', 'YYYY-MM-DD'))) * 86400000 
      + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3')) 
     into out_result 
     from dual; 
     return out_result; 
    end current_time_ms; 
1

este enlace ayuda para todos los idiomas currentmillis.com para Oracle:

SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL 
+0

Respuesta incorrecta ya que no toma la corriente timezone en cuenta. –

+0

la zona horaria actual se tiene en cuenta en SYSDATE. funciona correctamente – Milad

+0

Dentro de unos segundos el uno del otro: Hora actual Millis según https://currenttimemillis.com: 1489491379553 Hora actual Millis según el método anterior: 1489529163000 Diferencia: 37891447 –

Cuestiones relacionadas