Les problèmes triviaux sont qu'il vous manque un ;
lorsque vous définissez v_depart
, et à la fin de la ligne, vous affectez la valeur à v_duration
; et vous mélangez vos noms de variables. (Vous êtes également incohérent sur le type de car_info.id
; vous l'avez créé en tant que varchar
alors qu'il devrait probablement s'agir d'un nombre, mais c'est plutôt un commentaire sur votre question précédente).
Le principal problème est que vous ne pouvez pas effectuer un moins sur deux cordes, car cela ne veut vraiment rien dire. Vous devez effectuer la manipulation des dates d'origine, puis déterminer comment vous souhaitez renvoyer le résultat à l'appelant.
Soustraire une date d'une autre donne une valeur numérique, qui est le nombre de jours; les jours partiels sont des fractions, donc 0,25 correspond à 6 heures. Avec les dates de votre question précédente, cette requête :
select arrival, departure, departure - arrival as duration
from car_info
where car_id = 1;
... affiche une durée de 2,125, soit 2 jours et 3 heures.
Ce n'est pas la meilleure façon de procéder, mais pour vous montrer le processus de ce qui se passe, je vais utiliser ce numéro de durée et le convertir en une chaîne de manière assez longue :
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
Vous pouvez jouer avec les masques de format numérique, etc. pour obtenir le résultat souhaité.