天天看點

在oracle中實作DateDiff函數的功能

在orcale中是沒有DateDiff函數的功能的,想要實作時間比對功能可以這麼寫:

1.利用日期間的加減運算

天:

ROUND(TO_NUMBER(END_DATE - START_DATE))

小時:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24)

分鐘:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60)

秒:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60)

毫秒:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 60)

2.寫函數

Create Or Replace Function CDate(Datechar In Varchar2) Return Date Is  

    ReallyDo Date;   

Begin  

    Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),   

                           'YYYY-MM-DD'),   

                   'YYYY-MM-DD')   

    Into ReallyDo   

    From Dual;   

    Return(ReallyDo);   

End CDate;   

Create Or Replace Function CDateTime(Datechar In Varchar2) Return Date Is  

    ReallyDo Date;   

Begin  

    Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),   

                           'YYYY-MM-DD HH24:MI:SS'),   

                   'YYYY-MM-DD HH24:MI:SS')   

    Into ReallyDo   

    From Dual;   

    Return(ReallyDo);   

End CDateTime;   

Create Or Replace Function Datediff   

(   

    Datepart  In Varchar2,   

    StartDate In Varchar2,   

    EndDate   In Varchar2   

) Return Number Is  

    ReallyDo Numeric;   

Begin  

    Select Case Upper(Datepart)   

               When 'YYYY' Then  

                Trunc(Extract(Year From CDate(EndDate)) -   

                      Extract(Year From CDate(StartDate)))   

               When 'M' Then  

                Datediff('YYYY', StartDate, EndDate) * 12 +   

                (Extract(Month From CDate(EndDate)) -   

                 Extract(Month From CDate(StartDate)))   

               When 'D' Then  

                Trunc(CDate(EndDate) - CDate(StartDate))   

               When 'H' Then  

                Datediff('D', StartDate, EndDate) * 24 +   

                (to_Number(to_char(CDateTime(EndDate), 'HH24')) -   

                 to_Number(to_char(CDateTime(StartDate), 'HH24')))   

               When 'N' Then  

                Datediff('D', StartDate, EndDate) * 24 * 60 +   

                (to_Number(to_char(CDateTime(EndDate), 'MI')) -   

                 to_Number(to_char(CDateTime(StartDate), 'MI')))   

               When 'S' Then  

                Datediff('D', StartDate, EndDate) * 24 * 60 * 60 +   

                (to_Number(to_char(CDateTime(EndDate), 'SS')) -   

                 to_Number(to_char(CDateTime(StartDate), 'SS')))   

               Else  

                -29252888   

           End  

    Into ReallyDo   

    From Dual;   

    Return(ReallyDo);   

End Datediff;