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

Oracle ekvivalentní SQL Server/Sybase DateDiff

Většinu toho jsem před pár lety ukradl ze starého článku o tom, opravil jsem v článku nějaké chyby a vyčistil ho. Demarkační čáry pro datediff se mezi oracle a MSSQL počítají odlišně, takže musíte být opatrní s některými příklady, které se tam vznášejí a které správně nezohledňují hranice stylu MSSQL/Sybase, které neposkytují zlomkové výsledky.

Pomocí následujícího byste měli být schopni používat syntaxi MSSQL a získat stejné výsledky jako MSSQL, například SELECT DATEDIFF(dd,getdate(),DATEADD(dd,5,getdate())) FROM DUAL;

Tvrdím pouze, že to funguje - ne že je to efektivní nebo nejlepší způsob, jak to udělat. Nejsem člověk Oracle :) A možná byste si měli dvakrát rozmyslet použití mých maker funkcí k vyřešení potřeby uvozovek kolem dd, mm, hh, mi.. atd.

(aktualizace od Marka Harrisona) přidána funkce dy jako alias pro dd.

CREATE OR REPLACE FUNCTION GetDate 
RETURN date IS today date;
BEGIN
RETURN(sysdate);
END;
/

CREATE OR REPLACE FUNCTION mm RETURN VARCHAR2 IS BEGIN RETURN('mm'); END;
/
CREATE OR REPLACE FUNCTION yy RETURN VARCHAR2 IS BEGIN RETURN('yyyy'); END;
/
CREATE OR REPLACE FUNCTION dd RETURN VARCHAR2 IS BEGIN RETURN('dd'); END;
/
CREATE OR REPLACE FUNCTION dy RETURN VARCHAR2 IS BEGIN RETURN('dd'); END;
/
CREATE OR REPLACE FUNCTION hh RETURN VARCHAR2 IS BEGIN RETURN('hh'); END;
/
CREATE OR REPLACE FUNCTION mi RETURN VARCHAR2 IS BEGIN RETURN('mi'); END;
/
CREATE OR REPLACE FUNCTION ss RETURN VARCHAR2 IS BEGIN RETURN('ss'); END;
/

CREATE OR REPLACE Function DateAdd(date_type IN varchar2, offset IN integer, date_in IN date )
RETURN date IS date_returned date;
BEGIN
date_returned := CASE date_type
    WHEN 'mm'   THEN add_months(date_in,TRUNC(offset))
    WHEN 'yyyy' THEN add_months(date_in,TRUNC(offset) * 12)
    WHEN 'dd'   THEN date_in + TRUNC(offset)
    WHEN 'hh'   THEN date_in + (TRUNC(offset) / 24)
    WHEN 'mi'   THEN date_in + (TRUNC(offset) /24/60)
    WHEN 'ss'   THEN date_in + (TRUNC(offset) /24/60/60)
    END;
RETURN(date_returned);
END;
/

CREATE OR REPLACE Function DateDiff( return_type IN varchar2, date_1 IN date, date_2 IN date)
RETURN integer IS number_return integer;
BEGIN
number_return := CASE return_type
    WHEN 'mm'   THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'MM'),TRUNC(date_1, 'MM')))
    WHEN 'yyyy' THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'YYYY'), TRUNC(date_1, 'YYYY')))/12
    WHEN 'dd'   THEN ROUND((TRUNC(date_2,'DD') - TRUNC(date_1, 'DD')))
    WHEN 'hh'   THEN (TRUNC(date_2,'HH') - TRUNC(date_1,'HH')) * 24
    WHEN 'mi'   THEN (TRUNC(date_2,'MI') - TRUNC(date_1,'MI')) * 24 * 60
    WHEN 'ss'   THEN (date_2 - date_1) * 24 * 60 * 60
    END;
RETURN(number_return);
END;
/


  1. Jak aktualizovat data pomocí onclick i CHECKBOX bez tlačítka odeslat v php a mysql

  2. MySQL přeskočit prvních 10 výsledků

  3. mySQL>> Přidání HREF odkazů do Distinct GROUP_CONCAT

  4. Změna přesnosti číselného sloupce v Oracle