Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle sql - pengurangan tanggal dalam suatu fungsi

Masalah sepele adalah Anda kehilangan ; ketika Anda mendefinisikan v_depart , dan di akhir baris Anda menetapkan nilai ke v_duration; dan Anda mencampur nama variabel Anda. (Anda juga tidak konsisten tentang jenis car_info.id; Anda telah membuatnya sebagai varchar ketika itu mungkin harus berupa angka, tetapi itu lebih merupakan komentar atas pertanyaan Anda sebelumnya).

Masalah utamanya adalah Anda tidak dapat melakukan minus pada dua string, karena itu tidak berarti apa-apa. Anda perlu melakukan manipulasi tanggal asli, dan kemudian mencari tahu bagaimana Anda ingin mengembalikan hasilnya ke pemanggil.

Mengurangi satu tanggal dari yang lain memberikan nilai angka, yang merupakan jumlah hari; hari parsial adalah pecahan, jadi 0,25 adalah 6 jam. Dengan tanggal dari pertanyaan Anda sebelumnya, kueri ini:

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

... menunjukkan durasi 2.125, yaitu 2 hari dan 3 jam.

Ini bukan cara terbaik untuk melakukan ini, tetapi untuk menunjukkan kepada Anda proses apa yang terjadi, saya akan menggunakan nomor durasi itu dan mengubahnya menjadi string dengan cara yang bertele-tele:

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

Anda dapat bermain dengan topeng format angka dll. untuk mendapatkan hasil yang Anda inginkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Batch ORA-08177:tidak dapat membuat serial akses untuk transaksi ini saat menjalankan pekerjaan tunggal, tingkat isolasi SERIALIZED

  2. tabel pivot Oracle - cara mengubah item baris menjadi kolom

  3. distribusi pembayaran oracle sql query

  4. Oracle Pilih Tanggal Maks pada Beberapa catatan

  5. Apakah penggunaan klausa RETURNING INTO lebih cepat daripada pernyataan SELECT yang terpisah?