2010-05-13 4 views
11

Je veux être en mesure de stocker l'heure actuelle en millisecondes dans un champ de numéro Oracle. Comment faire cela via une requête?Oracle équivalent de java System.currentTimeMillis()?

select systimestamp from dual; 

renvoie l'horodatage réel. Y at-il de toute façon que je peux convertir cela en millisecondes de la même manière que le System.currentTimeMillis() de Java?

+0

Certains suggestions utiles ici: http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm –

Répondre

6

La fonction Java renvoie le nombre de millisecondes qui se sont écoulées depuis un moment fixe dans le temps. Cette heure est minuit le premier jour de 1970 UTC, c'est-à-dire le début de l'heure Unix.

La fonction suivante est la même pour PL/SQL. Il soustrait l'horodatage actuel du point de départ (où ms = 1). Il extrait les différents composants temporels et les transforme en secondes. Enfin, il multiplie tout par 1000 pour obtenir la valeur en millisecondes:

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 Java est activé dans la base de données vous pouvez trouver plus simple de créer un Java procédure stockée à la place:

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

Comparaison des les deux approches:

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> 

(je tiens à remercier Simon Nickerson, qui a repéré la faute de frappe dans la version précédente de ma fonction PL/SQL qui a produit un résultat anormal.)


Soit dit en passant, si vous ne souhaitez que le temps de l'centisecond, Oracle le plus proche a pour intégré qui: DBMS_UTILITY.GET_TIME().

+0

Il ya 3600 secondes dans une heure, pas 3660. –

+0

@SimonNickerson - Ah, cela l'expliquerait! Merci. – APC

+0

en fonction de vos paramètres, vous devrez peut-être créer l'horodatage base_point comme suit: to_timestamp ('1970-01-01 00: 00: 00.000', 'AAAA-MM-JJ HH24: MI: SS.FF') – Vladimir

1
  • fuseau horaire DB agnostique
  • avec millisecondes
  • œuvres 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

ce lien aide pour toutes les langues currentmillis.com pour Oracle:

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

Mauvaise réponse car il ne prend pas le courant timezone dans le compte. –

+0

Le fuseau horaire actuel est pris en compte dans SYSDATE. cela fonctionne correctement – Milad

+0

En quelques secondes les uns des autres: Current Time Millis selon https://currenttimemillis.com: 1489491379553 Heure actuelle Millis selon la méthode ci-dessus: 1489529163000 Différence: 37891447 –