sql >> Databasteknik >  >> RDS >> Oracle

Oracle sql - datumsubtraktion inom en funktion

Triviala problem är att du saknar en ; när du definierar v_depart , och i slutet av raden tilldelar du värdet till v_duration; och du blandar ihop dina variabelnamn. (Du är också inkonsekvent när det gäller typen av car_info.id; du har skapat den som en varchar när det förmodligen borde vara en siffra, men det är mer en kommentar till din tidigare fråga).

Huvudproblemet är att du inte kan utföra ett minus på två strängar, eftersom det egentligen inte betyder någonting. Du måste manipulera de ursprungliga datumen och sedan ta reda på hur du vill returnera resultatet till den som ringer.

Att subtrahera ett datum från ett annat ger ett talvärde, vilket är antalet dagar; deldagar är fraktioner, så 0,25 är 6 timmar. Med datumen från din tidigare fråga, denna fråga:

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

... visar en varaktighet på 2,125, vilket är 2 dagar och 3 timmar.

Det här är inte det bästa sättet att göra detta på, men för att visa dig processen för vad som händer kommer jag att använda det varaktighetsnumret och konvertera det till en sträng på ett ganska långrandigt sätt:

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 leka med sifferformatmasker etc. för att få den utdata du vill ha.



  1. SQLFeatureNotSupportedException på getArray

  2. korsapplicera xml-frågan presterar exponentiellt sämre när xml-dokumentet växer

  3. Psycopg2 :Skapa en tabell i en lagrad procedur Postgres

  4. Okänd tabell i MULTI DELETE