Тривиалните проблеми са, че ви липсва ;
когато дефинирате v_depart
и в края на реда присвоявате стойността на v_duration
; и смесвате имената на вашите променливи. (Вие също не сте последователни относно типа на car_info.id
; вие сте го създали като varchar
когато вероятно трябва да е число, но това е по-скоро коментар към предишния ви въпрос).
Основният проблем е, че не можете да изпълните минус на две струни, тъй като това всъщност не означава нищо. Трябва да извършите манипулация на оригиналните дати и след това да разберете как искате да върнете резултата на обаждащия се.
Изваждането на една дата от друга дава числова стойност, която е броят дни; частичните дни са дроби, така че 0,25 е 6 часа. С датите от предишния ви въпрос, тази заявка:
select arrival, departure, departure - arrival as duration
from car_info
where car_id = 1;
... показва продължителност от 2,125, което е 2 дни и 3 часа.
Това не е най-добрият начин да направите това, но за да ви покажа процеса на случващото се, ще използвам това число за продължителност и ще го преобразувам в низ по доста дълготраен начин:
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
Можете да играете с маските на числовия формат и т.н., за да получите желания резултат.