2011-08-22 43 views
12

È possibile fornire l'implementazione della funzione memorizzata per ottenere l'attuale systimestamp in millisecondi.
qualcosa che posso usare comeoracle systimestamp (sysdate) in millisecondi

select current_time_ms from dual; 

e ottenere la differenza, misurato in millisecondi, tra il momento attuale e la mezzanotte, 1 gennaio 1970 UTC.

Grazie.

+1

Guarda http://stackoverflow.com/questions/5881235/oracle-current-timestamp-to-seconds-conversion. C'è una risposta più breve e più veloce. – Vadzim

risposta

15
  • DB fuso orario agnostico
  • con millisecondi
  • opere in 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

Se il fuso orario della sessione sembra essere diverso da quello del sistema, questo può restituire un valore di 24 ore quando viene chiamato intorno alla mezzanotte (prima di dopo dipende dal modo in cui i due fusi orari sono correlati). Puoi facilmente testarlo con 'ALTER SESSION SET TIME_ZONE = '+ 08: 00'' o simile. La correzione sembra semplice: sostituisci 'da (systimestamp ...' con 'da (sys_extract_utc (systimestamp) ...' nella tua espressione. –

+0

risolto, grazie. –

+0

Ho scritto la versione "pure Java" (vedi la mia risposta). Con mio grande stupore, in test molto semplici, la versione di Java era molto più veloce di quella PL/SQL. –

8

La cosa migliore che io conosca è:

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; 

Io non sono abbastanza sicuro che cosa esigenze che avete per quanto riguarda il fuso orario. Potrebbe essere necessario apportare piccoli aggiustamenti per questo.

+3

Tt non tiene conto degli anni bisestili. –

+1

È preciso per secondi, non millisecondi –

1

AFAIK, non esiste un modo diretto per ottenere questo risultato (oltre alla scrittura manuale di una funzione SQL prolissa).

Perché ne hai bisogno in particolare?

È possibile utilizzare una funzione Java archiviata e quindi utilizzare System.getCurrentMillis() fornito da Java per restituire un valore in Millisecondi dall'1.1.1970 ad oggi.

+0

-1, @ La risposta di Codo è diretta e meno prolissa che scrive una funzione java e un wrapper pl/sql per esso. – DCookie

+0

D'accordo, se puoi farlo in SQL allora dovresti. – Ollie

+1

Questo è il modo giusto per farlo. Le altre risposte hanno bug sottili, perché non tengono conto di cose come anni bisestili o secondi bisestili. – Pablo

1

Sotto codice fornisce la differenza in millisecondi:

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 

Per la conversione di millisecondi a Ore , Minuti, secondi, modifica e utilizzare al di sotto di query a seconda dei casi: (! che sembra corretto)

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 
4

Aggiungendo a @Mykhaylo Adamovych risposta qui va un approccio più diretto utilizzando Oracle supporto Java (vale a dire non in XE e non in AWS RDS). Meno portabile (nel caso ti interessi), ma sembrava più veloce nel test my.

CREATE or replace FUNCTION current_java_timestamp RETURN number 
AS LANGUAGE JAVA NAME 'java.lang.System.currentTimeMillis() return java.lang.Long'; 
/
0
SELECT to_char(sysdate, 'HH24:MI:SS'), to_char(systimestamp, 'HH24:MI:SS.FF6') FROM dual 
Problemi correlati