Oracle
 sql >> Datenbank >  >> RDS >> Oracle

TIMESTAMPDIFF in Oracle 11g?

Diese Funktion existiert nicht in Oracle RDMBS; es war eindeutig in Oracle Lite (das ich noch nie gesehen habe) und ich glaube, es ist in anderen Datenbanken wie MySQL.

Es gibt eine Dokumentation über Datumszeit- und Intervallarithmetik was Sie einen Teil des Weges dorthin bringen wird; Sie können entweder einen Zeitstempel von einem anderen subtrahieren; oder ein Datum vom anderen oder eine Mischung aus beidem - aber es ist einfacher, sich an einen Datentyp zu halten. Je nachdem, was Sie verwenden, erhalten Sie entweder ein Intervall oder eine Zahl, die die Anzahl der Tage darstellt:

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

Wenn Sie nur die Anzahl ganzer Tage möchten, können Sie extract() für das Intervall, um genau das gewünschte Element zu erhalten, oder trunc() für die Zahl zum Entfernen des Bruchteils:

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

Sie könnten auch trunc() das aktuelle Datum vor dem Vergleich, wenn Sie es vorziehen, also vergleichen Sie beide um Mitternacht, was bedeutet, dass es keinen Bruchteil des Tages gibt, der entfernt werden muss:

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

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

Ich habe ANSI-Datumsliterale für das feste Datum verwendet, aber Sie können eine vorhandene Datums- oder Zeitstempelvariable oder -spalte verwenden. oder to_date() oder to_timestamp() wenn Sie eine Zeichenfolge in einem anderen Format haben.

Sie können auch extract() verwenden um die Komponenten eines Intervalls in einen kombinierten Wert umzuwandeln, wie hier gezeigt ; und stellen Sie außerdem sicher, dass Sie sich des Unterschieds zwischen aktuelles_datum bewusst sind und sysdate , und die Zeitstempel-Äquivalente .