Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle sql — odejmowanie daty w funkcji

Trywialne problemy polegają na tym, że brakuje Ci ; kiedy zdefiniujesz v_depart , a na końcu wiersza przypisujesz wartość do v_duration; i mieszasz nazwy zmiennych. (Jesteś również niespójny co do typu car_info.id; utworzyłeś go jako varchar kiedy prawdopodobnie powinna to być liczba, ale to bardziej komentarz do twojego poprzedniego pytania).

Główny problem polega na tym, że nie można wykonać minusa na dwóch strunach, ponieważ to tak naprawdę nic nie znaczy. Musisz dokonać manipulacji oryginalnymi datami, a następnie dowiedzieć się, w jaki sposób chcesz zwrócić wynik rozmówcy.

Odjęcie jednej daty od drugiej daje wartość liczbową, która jest liczbą dni; dni częściowe to ułamki, więc 0,25 to 6 godzin. Z datami z poprzedniego pytania, to zapytanie:

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

... pokazuje czas trwania 2.125, czyli 2 dni i 3 godziny.

Nie jest to najlepszy sposób, aby to zrobić, ale aby pokazać proces, co się dzieje, użyję tej liczby czasu trwania i przekonwertuję ją na ciąg w dość długi sposób:

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

Możesz bawić się maskami formatu liczb itp., aby uzyskać żądany wynik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cienki klient JDBC Oracle w celu przełączenia awaryjnego na drugą bazę danych

  2. Nie działa ustawienie PrepareStatement NULL dla tablicy NUMBER_ARRAY

  3. ORA-27154 / ORA-27146

  4. Metoda java.sql.Clob.free() JDBC 4 i kompatybilność wsteczna

  5. Spring Security Login nie działa z Oracle