sql >> Databasteknik >  >> RDS >> Oracle

TIMESTAMPDIFF i Oracle 11g?

Den funktionen finns inte i Oracle RDMBS; det gjorde det helt klart i Oracle Lite (som jag aldrig har stött på) och jag tror att det finns i andra databaser som MySQL.

Det finns dokumentation som täcker datumtid- och intervallaritmetik som tar dig en del av vägen dit; du kan antingen subtrahera en tidsstämpel från en annan; eller ett datum från ett annat, eller en blandning av de två - men det är enklare att hålla sig till en datatyp. Beroende på vad du använder får du antingen ett intervall eller ett tal som representerar antalet dagar:

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

Om du bara vill ha antalet hela dagar kan du använda code>extract() för att intervallet ska få precis det element du vill ha, eller >trunc() för numret för att ta bort 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 också trunc() det aktuella datumet före jämförelse om du föredrar det, så du jämför båda vid midnatt, vilket innebär att det inte finns en del av dagen att ta bort:

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

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

Jag har använt ANSI-datumliterals för det fasta datumet, men du kan använda en befintlig datum- eller tidsstämpelvariabel eller kolumn; eller to_date() eller to_timestamp() om du har en sträng i ett annat format.

Du kan också använda extract() för att konvertera ett intervalls komponenter till ett kombinerat värde, som visas här ; och se även till att du är medveten om skillnaden mellan nuvarande_datum och sysdate , och tidsstämpelns motsvarigheter .



  1. Django många frågar konstigt beteende

  2. Felsökning av privata procedurer

  3. Vad tycker du om att använda textidentifierare i tabellkolumner när du närmar dig databasen med normalisering och skalbarhet i åtanke?

  4. Det går inte att logga in på SQL Server 2008 via kommandoradsverktyget