请教各位高手: 我需要一个自定义函数,功能和sqlserver中的完全一样的datediff函数, 虽然网上面有很多,但是在执行的时候多是这样的:datediff('d',time,sysdate) 
time是列名,sysdate是oracle取得当前系统时间。 但是在sqlserver中是这样执行的 第一种:  datediff(d,time,getdate()) 第二种:datediff("d",time,getdate()) 在oracle执行的时候d多了两个单引号我现在要做的是兼容sqlserver和oracle数据库,我已经在oracle中自定义了一个getdate()的方法就后面的单引号无法统一,想了很多的办法就是无法达成一致, 请高手指点下  感激不尽!
下面是我的函数:
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 'DAY' Then
                 CDate(EndDate) - CDate(StartDate)
               When 'HH' Then
                Datediff('DAY', StartDate, EndDate) * 24 +
                 (to_Number(to_char(CDateTime(EndDate), 'HH24')) -
                  to_Number(to_char(CDateTime(StartDate), 'HH24')))
               When 'N' Then
                Datediff('DAY', StartDate, EndDate) * 24 * 60 +
                 (to_Number(to_char(CDateTime(EndDate), 'MI')) -
                  to_Number(to_char(CDateTime(StartDate), 'MI')))
               When 'S' Then
                Datediff('DAY', 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

解决方案 »

  1.   

    首先非常感谢你的关注与回答问题是这样的,我原来有一个系统已经兼容mysql和sqlserver,程序里用到了datediff函数,现在二期开发需要兼容oracle,所以原来的函数需要一个统一的格式,需要兼容三个数据库的,所有我就在oracle中自定义个datediff这个函数,现在就因为那个引号的小问题没有解决了!所以我看是否能在oracle自定义的函数上想办法!当然有其他的办法也可以!可是我除了定义自定义函数之外我不知道还有什么办法,可以做到!
      

  2.   

    最后函数返回时,用replace函数替换掉那个引号,需要的时候再加上
      

  3.   

    再次感谢你的回答:但是oralce调用datediff('d',time,sysdate) 的时候如果不加单引号就会报错,看是不是有什么类型传参的时候不要那个单引号的·
      

  4.   

    拼成字符串,用动态的execute immediate执行
      

  5.   

    Ojuju10你真是个热心人     请问execute immediate执行具体该怎么做呢?这个我没有接触过!请指点一下
      

  6.   

    重新写一个函数吧,不用mssql和mysql的,都换成自己写的函数。这样参数可以你自己定义,也就不存在引号的问题了。
      

  7.   

    datediff('d',time,sysdate)这里是你自己写的一个function
    Create Or Replace Function Datediff 

        Datepart  In Varchar2, 
        StartDate In Varchar2, 
        EndDate  In Varchar2 
    )Return Number其中
    Datepart是一个varchar2类型的参数所以调用的时候,当然是要加上''的,这表示只一个字符串呀。
      

  8.   

    然后把所有用到原来datediff的地方都把参数改成你定义的格式,这样就可以做到通用了。
    但是,通用的结果会带来查询效率的降低,要做好准备。
      

  9.   

    datediff('d',time,sysdate) 传参数的时候,'''d''',''表示一个'
      

  10.   

    我刚试过了,这样在sql中是不可以的!在oracle中也没有数据我想只有重写sql中的datediff方法了,请问高手可以给个吗?感激不尽!
      

  11.   

    1.oracle用你现在的就行了,参数都是字符串,把原先调用datediff的参数部分都改成字符串,这样在oracle下就可以用了。
    2.接下来,需要在mysql和mssql里各添加一个函数,实现部分(通过判断参数调用内部datediff)。