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

Oracle-Äquivalent zu SQL Server/Sybase DateDiff

Ich habe das meiste davon vor ein paar Jahren aus einem alten Tom-Artikel geklaut, einige Fehler aus dem Artikel behoben und ihn aufgeräumt. Die Abgrenzungslinien für datediff werden zwischen Oracle und MSSQL unterschiedlich berechnet, daher müssen Sie vorsichtig sein mit einigen Beispielen, die da draußen herumschwirren, die die Grenzen des MSSQL/Sybase-Stils nicht richtig berücksichtigen und keine gebrochenen Ergebnisse liefern.

Mit dem Folgenden sollten Sie in der Lage sein, die MSSQL-Syntax zu verwenden und dieselben Ergebnisse wie MSSQL zu erhalten, z. B. SELECT DATEDIFF(dd,getdate(),DATEADD(dd,5,getdate())) FROM DUAL;

Ich behaupte nur, dass es funktioniert - nicht, dass es effizient oder der beste Weg ist, es zu tun. Ich bin kein Oracle-Mensch :) Und Sie sollten vielleicht zweimal darüber nachdenken, meine Funktionsmakros zu verwenden, um das Problem zu umgehen, wenn Anführungszeichen um dd, mm, hh, mi ... etc. benötigt werden.

(aktualisiert von Mark Harrison) dy-Funktion als Alias ​​für dd hinzugefügt.

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;
/