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就是一分钟

posted @ 2013-12-13 14:01  EdwardSun888  阅读(21587)  评论(0编辑  收藏  举报