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

TIMESTAMPDIFF i Oracle 11g?

Den funktion findes ikke i Oracle RDMBS; det gjorde det tydeligvis i Oracle Lite (som jeg aldrig har stødt på), og jeg tror, ​​det er i andre databaser som MySQL.

Der er dokumentation, der dækker datotid og intervalaritmetik som vil få dig en del af vejen dertil; du kan enten trække et tidsstempel fra et andet; eller en dato fra en anden, eller en blanding af de to – men det er nemmere at holde sig til én datatype. Afhængigt af, hvad du bruger, får du enten et interval eller et tal, der repræsenterer antallet af dage:

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

Hvis du bare vil have antallet af hele dage, kan du bruge >extract() for intervallet for at få lige det element, du ønsker, eller >trunc() for tallet for at fjerne brøkdelen:

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

Du kan også trunc() den aktuelle dato før sammenligning, hvis du foretrækker det, så du sammenligner begge ved midnat, hvilket betyder, at der ikke vil være en del af dagen at fjerne:

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

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

Jeg har brugt ANSI-dato-literals til den faste dato, men du kan bruge en eksisterende dato- eller tidsstempelvariabel eller kolonne; eller to_date() eller to_timestamp() hvis du har en streng i et andet format.

Du kan også bruge extract() for at konvertere et intervals komponenter til en kombineret værdi, som vist her ; og sørg også for, at du er opmærksom på forskellen mellem current_date og sysdate , og tidsstemplets ækvivalenter .



  1. UNION-syntaks i Cakephp

  2. Blanding sammen Connect by, indre join og sum med Oracle

  3. MySQL fuldtekstsøgning over flere kolonner:resultatforvirring

  4. Foretager MySQL view altid fuld tabelscanning?