sql >> Database >  >> RDS >> Oracle

Oracle sql - datumaftrekking binnen een functie

Triviale problemen zijn dat je een ; wanneer u v_depart definieert , en aan het einde van de regel wijst u de waarde toe aan v_duration; en je haalt je variabelenamen door elkaar. (Je bent ook niet consistent over het type car_info.id; je hebt het gemaakt als een varchar terwijl het waarschijnlijk een getal zou moeten zijn, maar dat is meer een opmerking op je vorige vraag).

Het grootste probleem is dat je geen min op twee snaren kunt spelen, omdat dat eigenlijk niets betekent. U moet de originele datums manipuleren en vervolgens uitzoeken hoe u het resultaat naar de beller wilt terugsturen.

Het aftrekken van de ene datum van de andere geeft een getalswaarde, namelijk het aantal dagen; gedeeltelijke dagen zijn breuken, dus 0,25 is 6 uur. Met de data van uw vorige vraag, deze vraag:

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

... toont een duur van 2.125, dat is 2 dagen en 3 uur.

Dit is niet de beste manier om dit te doen, maar om je het proces te laten zien van wat er aan de hand is, zal ik dat duurnummer gebruiken en het op een vrij langdradige manier omzetten in een string:

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

U kunt spelen met de nummerformaatmaskers enz. om de gewenste uitvoer te krijgen.



  1. Vreemde tekens krijgen bij het ophalen van waarde in mysql-database

  2. De SELECT-machtiging is geweigerd voor het object 'Address', database 'CNET_85731', schema 'dbo'

  3. Query met twee tijdstempels werkt niet

  4. PHP-waarschuwing bij opstarten tijdens het laden van php_oci8.dll