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

TIMESTAMPDIFF in Oracle 11g?

Quella funzione non esiste in Oracle RDMBS; ha funzionato chiaramente in Oracle Lite (che non ho mai incontrato) e credo che sia in altri database come MySQL.

C'è documentazione che copre datetime e intervallo aritmetica che ti porterà parte della strada lì; puoi sottrarre un timestamp da un altro; o una data da un'altra, o un mix dei due, ma è più semplice attenersi a un tipo di dati. A seconda di quale utilizzi, otterrai un intervallo o un numero che rappresenta il numero di giorni:

SQL> SELECT CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00' FROM DUAL;

CURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00'
---------------------------------------------------------------------------
+000006169 16:16:21.287166000

SQL> SELECT CURRENT_DATE - DATE '1998-12-09' FROM DUAL;

CURRENT_DATE-DATE'1998-12-09'
-----------------------------
                   6169.67775

Se vuoi solo il numero di giorni interi puoi usare extract() per l'intervallo per ottenere solo l'elemento desiderato, oppure trunc() per il numero rimuovere la parte frazionaria:

SQL> SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00') FROM DUAL;

EXTRACT(DAYFROMCURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00')
---------------------------------------------------------------
                                                           6169

SQL> SELECT TRUNC(CURRENT_DATE - DATE '1998-12-09') FROM DUAL;

TRUNC(CURRENT_DATE-DATE'1998-12-09')
------------------------------------
                                6169

Potresti anche trunc() la data corrente prima del confronto, se preferisci, quindi stai confrontando entrambi a mezzanotte, il che significa che non ci sarà una parte del giorno frazionario da rimuovere:

SQL> SELECT TRUNC(CURRENT_DATE) - DATE '1998-12-09' FROM DUAL;

TRUNC(CURRENT_DATE)-DATE'1998-12-09'
------------------------------------
                                6169

Ho usato valori letterali di data ANSI per la data fissa, ma puoi utilizzare una data esistente o una variabile o una colonna di timestamp; o to_date() o to_timestamp() se hai una stringa in un formato diverso.

Puoi anche usare extract() per convertire i componenti di un intervallo in un valore combinato, come mostrato qui ; e assicurati anche di essere a conoscenza della differenza tra current_date e sysdate e gli equivalenti timestamp .