Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle sql - phép trừ ngày tháng trong một hàm

Vấn đề nhỏ là bạn thiếu ; khi bạn xác định v_depart và ở cuối dòng, bạn gán giá trị cho v_duration; và bạn đang trộn các tên biến của mình. (Bạn cũng không nhất quán về loại car_info.id; bạn đã tạo nó dưới dạng varchar khi nó có thể phải là một con số, nhưng đó là một nhận xét nhiều hơn cho câu hỏi trước của bạn).

Vấn đề chính là bạn không thể thực hiện phép trừ trên hai chuỗi, vì điều đó không thực sự có nghĩa. Bạn cần thực hiện thao tác với các ngày ban đầu và sau đó tìm ra cách bạn muốn trả lại kết quả cho người gọi.

Trừ một ngày cho một ngày khác sẽ cho một giá trị số, đó là số ngày; một phần ngày là phân số, do đó 0,25 là 6 giờ. Với các ngày từ lần truy cập trước của bạn, truy vấn này:

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

... hiển thị thời lượng 2.125, tức là 2 ngày và 3 giờ.

Đây không phải là cách tốt nhất để làm điều này, nhưng để cho bạn thấy quá trình những gì đang xảy ra, tôi sẽ sử dụng số thời lượng đó và chuyển nó thành một chuỗi theo một cách khá dài dòng:

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

Bạn có thể chơi với các mặt nạ định dạng số, v.v. để có được đầu ra bạn muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để sử dụng các biến trong Oracle SQL Developer?

  2. SSDT trong Visual Studio 2015 Sự cố kết nối Oracle

  3. Câu hỏi về khóa chính / khóa ngoại hỗn hợp Oracle

  4. Tiêu chuẩn ANSI SQL cho từ khóa ORACLE MINUS

  5. Cách tránh lỗi ORA-04091 trong trình kích hoạt