zoukankan      html  css  js  c++  java
  • Oracle常用函数:DateDiff() 返回两个日期之间的时间间隔自定义函数

    首先在oracle中没有datediff()函数
    可以用以下方法在oracle中实现该函数的功能:
    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;

     

    Oracle常用函数:DateDiff() 返回两个日期之间的时间间隔自定义函数

    (当然也有其他方法实现,在ORACLE里日期类型是可以直接进行比较的,最后会给出方法示例)

    Sql代码  收藏代码
    1. Create Or Replace Function CDate(Datechar In Varchar2) Return Date Is  
    2.     ReallyDo Date;  
    3. Begin  
    4.     Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),  
    5.                            'YYYY-MM-DD'),  
    6.                    'YYYY-MM-DD')  
    7.     Into ReallyDo  
    8.     From Dual;  
    9.     Return(ReallyDo);  
    10. End CDate;  
    11.   
    12.    
    13.   
    14. Create Or Replace Function CDateTime(Datechar In Varchar2) Return Date Is  
    15.     ReallyDo Date;  
    16. Begin  
    17.     Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),  
    18.                            'YYYY-MM-DD HH24:MI:SS'),  
    19.                    'YYYY-MM-DD HH24:MI:SS')  
    20.     Into ReallyDo  
    21.     From Dual;  
    22.     Return(ReallyDo);  
    23. End CDateTime;  
    24.   
    25.    
    26.   
    27. Create Or Replace Function Datediff  
    28. (  
    29.     Datepart  In Varchar2,  
    30.     StartDate In Varchar2,  
    31.     EndDate   In Varchar2  
    32. Return Number Is  
    33.     ReallyDo Numeric;  
    34. Begin  
    35.     Select Case Upper(Datepart)  
    36.                When 'YYYY' Then  
    37.                 Trunc(Extract(Year From CDate(EndDate)) -  
    38.                       Extract(Year From CDate(StartDate)))  
    39.                When 'M' Then  
    40.                 Datediff('YYYY', StartDate, EndDate) * 12 +  
    41.                 (Extract(Month From CDate(EndDate)) -  
    42.                  Extract(Month From CDate(StartDate)))  
    43.                When 'D' Then  
    44.                 Trunc(CDate(EndDate) - CDate(StartDate))  
    45.                When 'H' Then  
    46.                 Datediff('D', StartDate, EndDate) * 24 +  
    47.                 (to_Number(to_char(CDateTime(EndDate), 'HH24')) -  
    48.                  to_Number(to_char(CDateTime(StartDate), 'HH24')))  
    49.                When 'N' Then  
    50.                 Datediff('D', StartDate, EndDate) * 24 * 60 +  
    51.                 (to_Number(to_char(CDateTime(EndDate), 'MI')) -  
    52.                  to_Number(to_char(CDateTime(StartDate), 'MI')))  
    53.                When 'S' Then  
    54.                 Datediff('D', StartDate, EndDate) * 24 * 60 * 60 +  
    55.                 (to_Number(to_char(CDateTime(EndDate), 'SS')) -  
    56.                  to_Number(to_char(CDateTime(StartDate), 'SS')))  
    57.                Else  
    58.                 -29252888  
    59.            End  
    60.     Into ReallyDo  
    61.     From Dual;  
    62.     Return(ReallyDo);  
    63. End Datediff;  

     

     当然也有其他方法实现

     在ORACLE里日期类型是可以直接进行比较的。举个例子:

    SQL> SELECT to_date('2011-10-05', 'yyyy-mm-dd') - to_date('2011-10-07', 'yyyy-mm-dd') FROM dual ;

    TO_DATE('2011-10-05','YYYY-MM-DD')-TO_DATE('2011-10-07','YYYY-MM-DD')
    ---------------------------------------------------------------------
                                                                       -2

    这说明2011-10-05要比7号早2天。

    SQL> SELECT to_date('2011-10-07 14:23:24' , 'yyyy-mm-dd hh24:mi:ss') + 1/24 FROM dual ;

    TO_DATE('2011-10-07
    -------------------
    2011-10-07 15:23:24

    SQL>

    这是说明在某一时间上加一小时,1是代表一天,1/24就是一小时,同理1/24/60就是一分钟

  • 相关阅读:
    47数据结构与算法分析之---查找的基本概念
    46数据结构与算法分析之---排序方法比较
    45数据结构与算法分析之---基数排序
    44数据结构与算法分析之---归并排序
    43数据结构与算法分析之---选择排序
    42数据结构与算法分析之---交换排序
    41数据结构与算法分析之---插入排序
    54数据结构与算法分析之---哈希查找
    40数据结构与算法分析之---排序的基本概念
    37数据结构与算法分析之---关键路径
  • 原文地址:https://www.cnblogs.com/edwardsun/p/3472956.html
Copyright © 2011-2022 走看看