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.