高手进!如何把Sql里面的datediff()方法,在Oracle里面如何替换使用啊?

这是Oracle里面的语法,如何把datediff()替换掉,求解答啊?全解加分哦。。。
@interval传入的值是day,week,month
@startingdatetype一个开始的日期
@endingdatetype一个结束的日期
select datediff(' + @interval + ',' + @startingdatetype + ',' + @endingdatetype + ')
as Turnaround, count(clmno) as cnt
from hsttran ch
where pddt between to_date('2013-07-01','yyyy-mm-dd') and to_date('2013-07-26','yyyy-mm-dd')
group by datediff(' + @interval + ',' + @startingdatetype + ',' + @endingdatetype + ')
order by Turnaround, cnt
最新回答
贴心小棉袄

2024-09-25 07:07:55

create or replace function datediff(type in varchar2, startTime in varchar2,endTime in varchar2,v in varchar2) return number as
v_result number;
sql_1 varchar2(200);
begin
dbms_output.put_line('1');
if(type = 'day') then
sql_1 := 'select '||v||'(TO_NUMBER(to_date('''||startTime||''',''YYYY-MM-DD'') - to_date('''||endTime||''',''YYYY-MM-DD''))) from dual';
dbms_output.put_line('1');
elsif(type = 'month') then
sql_1 := 'select '||v||'(months_between(to_date('''||startTime||''',''YYYY-MM-DD'') - to_date('''||endTime||''',''YYYY-MM-DD''))) from dual' ;
dbms_output.put_line('1');
elsif(type = 'week') then
dbms_output.put_line('1');
sql_1 := 'select '||v||'(TO_NUMBER(to_date('''||startTime||''',''YYYY-MM-DD'') - to_date('''||endTime||''',''YYYY-MM-DD''))/7) from dual ';
end if;
dbms_output.put_line(sql_1);
EXECUTE IMMEDIATE sql_1 into v_result ;
return (v_result);
end;
--先执行以上函数,这样就在Oracle自己写了一个该函数;
使用时候可以这样:
select datediff('week','2012-09-01','2012-08-01','round') from dual ;
--说明'week'表示周,'month'表示月,'day'表示天
--中间传俩日期
--第四个参数:周或月四舍五入用‘round’ ,向上取整用‘ceil’ 向下取整用‘floor’
追问
在以上sql中直接调用datediff方法run不到任何值啊?求指点。。。
追答

你检查下函数是否编译通过,这个是我上午刚写的,在自己机器上是测试通过滴

追问
哦,这个我测试也通过。我是想讲,在我写的sql里面调用的话,是直接调用的datediff方法?还是像你写的那种调用sql啊?
追答
看你具体调用啦,很随意的啦。比如你现在有一个学生表,里面有两个日期你想比较下这个学生表的日期相差天数,其他字段正常拿
select stuName,stuId,datediff('week',stuDate1,stuDate2,'round') from pub_student;

这个函数你可以随便写在你需要用的位置,所有的查询位置你都可以丢在那使用,也可以放在函数或者存储过程中使用
你我咫尺之隔

2024-09-25 19:33:58

首先在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里面当列使用?
哦,有计算week的方法吗?帮忙贴上,我只要传入月、周、日计算就行了,谢谢。。。