Oracle
 sql >> Database >  >> RDS >> Oracle

Come trovare i valori del formato TIMESTAMP di differenza b/n in Oracle?

Il risultato dell'aritmetica del timestamp è un tipo di dati INTERVAL. Hai un INTERVAL GIORNO AL SECONDO lì...

Se vuoi il numero di minuti in un modo sarebbe usare EXTRACT() , ad esempio:

select extract( minute from interval_difference ) * 60 
        + extract( hour from interval_difference ) * 60
        + extract( day from interval_difference ) * 60 * 24
  from ( select systimestamp - (systimestamp - 1) as interval_difference
           from dual )

In alternativa puoi usare un trucco con le date:

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

La versione "trucco" funziona a causa dell'ordine di precedenza dell'operatore e delle differenze tra data e timestamp aritmetica.

Inizialmente l'operazione si presenta così:

date + ( interval * number ) - date

Come indicato nella documentazione:

Oracle valuta le espressioni tra parentesi prima di valutare quelle esterne.

Quindi, la prima operazione l'ha eseguita per moltiplicare l'intervallo per 1.440. Un intervallo, cioè un periodo di tempo discreto, moltiplicato per un numero è un altro periodo di tempo discreto, vedere la documentazione sull'aritmetica data/ora e intervallo. Quindi, il risultato di questa operazione è un intervallo, lasciandoci con:

date + interval - date

L'operatore più ha la precedenza sul meno qui. La ragione di ciò potrebbe essere che un intervallo meno una data è un'operazione non valida, ma la documentazione implica anche che questo sia il caso (non esce e lo dice). Quindi, la prima operazione eseguita è data + intervallo. Una data più un intervallo è una data. Lasciando solo

date - date

Come da documentazione, questo risulta in un numero intero che rappresenta il numero di giorni. Tuttavia, hai moltiplicato l'intervallo originale per 1.440, quindi questo ora rappresentava 1.440 volte il numero di giorni che avrebbe altrimenti. Ti rimane quindi il numero di secondi.

Vale la pena notare che:

Quando i calcoli dell'intervallo restituiscono un valore datetime, il risultato deve essere un valore datetime effettivo o il database restituisce un errore. Ad esempio, le due istruzioni successive restituiscono errori:

Il metodo del "trucco" farà fallire, raramente ma fallirà comunque. Come sempre è meglio farlo come si deve.