Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle sql - soustraction de date dans une fonction

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é.