sql >> Databáze >  >> RDS >> Oracle

TIMESTAMPDIFF v Oracle 11g?

Tato funkce v Oracle RDMBS neexistuje; jasně to bylo v Oracle Lite (se kterým jsem se nikdy nesetkal) a věřím, že je to i v jiných databázích, jako je MySQL.

Existuje dokumentace týkající se aritmetika data, času a intervalu který vás dostane na část cesty tam; můžete buď odečíst jedno časové razítko od druhého; nebo jedno datum od druhého nebo kombinace obou – ale je jednodušší držet se jednoho datového typu. Podle toho, co použijete, získáte buď interval, nebo číslo představující počet dní:

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

Pokud chcete pouze počet celých dní, můžete použít extract() aby interval získal pouze prvek, který chcete, nebo trunc() pro číslo k odstranění zlomkové části:

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

Můžete také trunc() aktuální datum před porovnáním, chcete-li, takže porovnáváte oba o půlnoci, což znamená, že nebude nutné odstranit zlomkovou část dne:

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

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

Pro pevné datum jsem použil datové literály ANSI, ale můžete použít existující proměnnou nebo sloupec data nebo časového razítka; nebo to_date() nebo to_timestamp() pokud máte řetězec v jiném formátu.

Můžete také použít extract() chcete-li převést složky intervalu na kombinovanou hodnotu, jak je uvedeno zde ; a také se ujistěte, že víte o rozdílu mezi current_date a sysdate a ekvivalenty časového razítka .



  1. Usnadnění správy produkční databáze PostgreSQL

  2. Jak rozložit průměr mezi dva intervaly v orákulu

  3. Obnovení tabulky MySQL zpět do databáze

  4. SqlDataSourceEnumerator.Instance.GetDataSources() nenalezne místní instanci SQL serveru 2008