Tôi cho rằng đây là bài tập về nhà, vì vậy một số gợi ý ...
Đầu tiên, đừng bao giờ lưu trữ ngày tháng dưới dạng varchar
, nó sẽ gây ra cho bạn và người tối ưu hóa tất cả các loại vấn đề.
Thứ hai, date
của Oracle kiểu dữ liệu chỉ có thể lưu trữ đến độ chính xác thứ hai và chuỗi của bạn có các phần nhỏ của giây, vì vậy bạn đang xem timestamp
thay vì date
. Bạn có thể chuyển đổi chuỗi của mình thành dấu thời gian bằng to_timestamp()
, truyền một mặt nạ định dạng
phù hợp . Ồ được rồi, tôi đang cảm thấy hào phóng:
select to_timestamp(start_date, 'DD-Mon-RR HH.MI.SS.FF9 AM') from your_table;
Thứ ba, trừ hai dấu thời gian sẽ cung cấp cho bạn một interval
kiểu dữ liệu, từ đó bạn sẽ cần trích xuất thông tin bạn muốn ở định dạng có thể đọc được. Tìm kiếm trang web này hoặc nơi khác để trừ dấu thời gian, nhưng tôi sẽ chỉ cho bạn tại trang này gần đây
như một mẫu.
Mức trung bình phức tạp hơn một chút, vì vậy bạn có thể muốn chuyển đổi khoảng thời gian của mình thành số cho điều đó; tìm kiếm lại các câu hỏi trước đó, chẳng hạn như câu hỏi này . Kích thước của các khoảng thời gian, độ chính xác mà bạn thực sự quan tâm và cách bạn muốn định dạng đầu ra, v.v. sẽ có một số ảnh hưởng đến cách tiếp cận bạn muốn thực hiện.
Nếu bạn cần một kết quả gần đúng thì câu trả lời của @Joachim Isaksson sẽ cung cấp cho bạn điều đó - 'gần đúng' vì làm tròn; chẳng hạn như thời lượng dưới một giây sẽ hiển thị bằng 0. Hiệu ứng tương tự có thể được nhìn thấy với dấu thời gian được truyền đến ngày, điều này cũng làm mất số giây phân số:
select 24*60*60*avg(
cast(to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
- cast(to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
) as avg_duration
from process_audit;
Câu trả lời chính xác hơn có thể được tìm thấy bằng cách trích xuất các thành phần khác nhau của dấu thời gian, như trong một câu hỏi mà tôi đã liên kết trước đó. Bạn có thể không cần tất cả chúng nếu bạn biết rằng thời lượng của bạn luôn ít hơn một giờ, chẳng hạn, nhưng nếu bạn cần nhiều hơn một (tức là nếu thời lượng có thể hơn một phút) thì việc sử dụng biểu thức bảng chung trung gian sẽ đơn giản hóa mọi thứ a bit:
with cte as (
select to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM')
- to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as duration
from process_audit
)
select avg(extract(second from duration)
+ extract(minute from duration) * 60
+ extract(hour from duration) * 60 * 60
+ extract(day from duration) * 60 * 60 * 24) as avg_duration
from cte;
Với hai hàng mẫu, một hàng có khoảng cách chính xác một giây và một có khoảng cách chính xác 1,5 giây, điều này cho kết quả 1.25
.