sql >> Database teknologi >  >> RDS >> Oracle

Oracle sql - datosubtraktion i en funktion

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.



  1. phpMyBackupPro – Et webbaseret MySQL-sikkerhedskopieringsværktøj til Linux

  2. MYSQLI forberedt sætning bind_param typer virker ikke

  3. Indstil værdien til NULL i MySQL

  4. MYSQL CONCAT MAX LÆNGDE