web-dev-qa-db-fra.com

oracle systimestamp (sysdate) à millisecondes

Pourriez-vous fournir l'implémentation de la fonction stockée pour obtenir la variable systimestamp actuelle en millisecondes.
Quelque chose que je peux utiliser comme

select current_time_ms from dual;

et obtenez la différence, en millisecondes, entre l'heure actuelle et minuit, le 1er janvier 1970 UTC.

Merci.

12
Mykhaylo Adamovych
  • Agnostique du fuseau horaire DB
  • en millisecondes
  • fonctionne en XE
 fonction current_time_ms 
 numéro de retour 
 est
 out_result number; 
 commencer
 sélectionnez extrait (jour de (sys_extract_utc (systimestamp)) - to_timestamp ('1970-01-01,' AAAA-MM-JJ '))) * 86400000. + to_number (to_char (sys_extract_utc (horodatage système), 'SSSSSFF3'))) 
 en out_result 
 de dual; 
 return out_result; 
 end current_time_ms; 
17
Mykhaylo Adamovych

La meilleure chose que je connaisse est:

select extract(day    from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000
     + extract(hour   from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000
     + extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000
     + extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000 unix_time
from dual;

Je ne suis pas tout à fait sûr de vos exigences concernant le fuseau horaire. Vous devrez peut-être faire des ajustements mineurs pour cela.

8
Codo

Ajouter à la réponse de @Mykhaylo Adamovych (ce qui semble correct!) Est une approche plus simple utilisant le support Oracle Java (c'est-à-dire pas dans XE ni dans AWS RDS). Moins portable (au cas où vous l'aimeriez), mais semblait plus rapide dans mon test.

CREATE or replace FUNCTION current_Java_timestamp RETURN number
AS LANGUAGE Java NAME 'Java.lang.System.currentTimeMillis() return Java.lang.Long';
/
4
Piotr Findeisen

Le code ci-dessous indique la différence en millisecondes:

with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000  
    dif
from t

Pour la conversion de millisecondes en heures, minutes, secondes, modifiez et utilisez la requête ci-dessous, selon le cas:

with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000  
    dif,
    (to_char (to_date(round(( extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000)/1000), 'SSSSS' ), 'HH24"Hrs" MI"Min" SS"Sec"'))  timeval
from t
1

Autant que je sache, il n’existe aucun moyen direct d’y parvenir (autre que l’écriture manuelle d’une fonction SQL longue durée).

Pourquoi avez-vous besoin de cela spécifiquement?

Vous pouvez utiliser une fonction Java stockée, puis le System.getCurrentMillis () fourni par Java pour vous renvoyer une valeur en millisecondes allant du 1.1.1970 à maintenant.

1
Ollie