sql >> Databáze >  >> RDS >> Oracle

Oracle sql - odečítání data v rámci funkce

Triviální problém je, že vám chybí ; když definujete v_depart a na konci řádku přiřadíte hodnotu v_duration; a pletete si názvy proměnných. (Také jste nekonzistentní ohledně typu car_info.id; vytvořili jste jej jako varchar když by to pravděpodobně mělo být číslo, ale to je spíše komentář k vaší předchozí otázce).

Hlavním problémem je, že nemůžete provést mínus na dvou strunách, protože to vlastně nic neznamená. Musíte provést manipulaci s původními daty a pak zjistit, jak chcete vrátit výsledek volajícímu.

Odečtením jednoho data od druhého získáte číselnou hodnotu, což je počet dní; dílčí dny jsou zlomky, takže 0,25 je 6 hodin. S daty z vašeho předchozího dotazu tento dotaz:

select arrival, departure, departure - arrival as duration
from car_info
where car_id = 1;

... ukazuje trvání 2,125, což je 2 dny a 3 hodiny.

Toto není nejlepší způsob, jak to udělat, ale abych vám ukázal proces toho, co se děje, použiji toto číslo trvání a převedu ho na řetězec poměrně dlouhým způsobem:

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

Můžete si hrát s maskami číselného formátu atd., abyste získali požadovaný výstup.



  1. mysql – Jak zacházet s vyhledáváním dotazů se speciálními znaky %(procenta) a _(podtržítko)

  2. NA DUPLIKÁTNÍM KLÍČI:vícesloupcové jedinečné omezení

  3. MySQL - Je možné použít LIKE na všechny sloupce v tabulce?

  4. Jak mohu inicializovat databázi MySQL se schématem v kontejneru Docker?