sql >> Database >  >> RDS >> Oracle

Oracle equivalent aan SQL Server/Sybase DateDiff

Ik heb het meeste hiervan een paar jaar geleden uit een oud Tom-artikel gestolen, een aantal bugs uit het artikel opgelost en het opgeruimd. De demarcatielijnen voor datediff worden anders berekend tussen orakel en MSSQL, dus je moet voorzichtig zijn met enkele voorbeelden die daar rondzweven die niet goed rekening houden met MSSQL/Sybase-stijlgrenzen die geen fractionele resultaten opleveren.

Met het volgende zou u de MSSQL-syntaxis moeten kunnen gebruiken en dezelfde resultaten krijgen als MSSQL, zoals SELECT DATEDIFF(dd,getdate(),DATEADD(dd,5,getdate())) FROM DUAL;

Ik beweer alleen dat het werkt - niet dat het efficiënt is of de beste manier om het te doen. Ik ben geen Oracle-persoon :) En misschien wil je wel twee keer nadenken over het gebruik van mijn functiemacro's om een ​​tijdelijke oplossing te vinden, waarbij je aanhalingstekens nodig hebt rond dd,mm,hh,mi..etc.

(update door Mark Harrison) dy-functie toegevoegd als alias voor 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. PHP- en MYSQL-databaseverbinding en slechts één keer maken van tabellen

  2. volgorde van uitvoering in webomgeving

  3. Hoe de querycache in mysql wissen?

  4. Voeg twee tabellen samen in MySQL en retourneer slechts één rij van de tweede tabel