Trivielle problemer er, at du mangler en ;
når du definerer v_depart
, og i slutningen af linjen tildeler du værdien til v_duration
; og du blander dine variabelnavne sammen. (Du er også inkonsekvent med hensyn til typen car_info.id
; du har oprettet det som en varchar
når det nok burde være et tal, men det er mere en kommentar til dit tidligere spørgsmål).
Hovedproblemet er, at man ikke kan præstere et minus på to strenge, da det egentlig ikke betyder noget. Du skal udføre manipulationen af de originale datoer og derefter finde ud af, hvordan du vil returnere resultatet til den, der ringer.
At trække en dato fra en anden giver en talværdi, som er antallet af dage; deldage er fraktioner, så 0,25 er 6 timer. Med datoerne fra dit tidligere spørgsmål, denne forespørgsel:
select arrival, departure, departure - arrival as duration
from car_info
where car_id = 1;
... viser varighed på 2.125, hvilket er 2 dage og 3 timer.
Dette er ikke den bedste måde at gøre dette på, men for at vise dig processen med, hvad der foregår, vil jeg bruge det varighedsnummer og konvertere det til en streng på en ret langhåret måde:
CREATE OR REPLACE FUNCTION get_duration (p_car_id number)
RETURN varchar2 is
v_arrive date;
v_depart date;
v_duration number;
v_days number;
v_hours number;
v_minutes number;
v_seconds number;
BEGIN
select arrival, departure, departure - arrival
into v_arrive, v_depart, v_duration
from car_info
where car_id = p_car_id;
-- Days is the whole-number part, which you can get with trunc
v_days := trunc(v_duration);
-- Hours, minutes and seconds are extracted from the remainder
v_hours := trunc(24 * (v_duration - v_days));
v_minutes := trunc(60 * (v_duration - v_days - (v_hours/24)));
v_seconds := trunc(60 * (v_duration - v_days - (v_hours/24)
- (v_minutes/(24*60))));
return v_days || ' days '
|| to_char(v_hours, '00') || ' hours '
|| to_char(v_minutes, '00') || ' minutes '
|| to_char(v_seconds, '00') || ' seconds';
END;
/
Function created.
show errors
No errors.
select get_duration(1) from dual;
GET_DURATION(1)
--------------------------------------------------------------------------------
2 days 03 hours 00 minutes 00 seconds
Du kan lege med talformatmasker osv. for at få det output, du ønsker.