Saya menganggap ini pekerjaan rumah, jadi ada beberapa petunjuk...
Pertama, jangan pernah menyimpan tanggal sebagai varchar
, itu akan menyebabkan Anda dan pengoptimal segala macam masalah.
Kedua, date
Oracle tipe data hanya dapat menyimpan ke presisi kedua, dan string Anda memiliki sepersekian detik, jadi Anda melihat timestamp
daripada date
. Anda dapat mengonversi string menjadi stempel waktu dengan to_timestamp()
fungsi, meneruskan masker format
yang sesuai . Oh oke, saya merasa murah hati:
select to_timestamp(start_date, 'DD-Mon-RR HH.MI.SS.FF9 AM') from your_table;
Ketiga, mengurangi dua stempel waktu akan memberi Anda interval
tipe data, dari mana Anda perlu mengekstrak informasi yang Anda inginkan dalam format yang dapat dibaca. Telusuri situs ini atau di tempat lain untuk pengurangan stempel waktu, tetapi saya akan mengarahkan Anda ke yang terbaru
sebagai sampel.
Rata-ratanya sedikit lebih rumit, jadi Anda mungkin ingin mengonversi interval Anda menjadi angka untuk itu; cari lagi pertanyaan sebelumnya, seperti yang ini . Ukuran interval, presisi yang benar-benar Anda pedulikan, dan format output yang Anda inginkan, dll. akan memengaruhi pendekatan yang ingin Anda ambil.
Jika Anda membutuhkan hasil perkiraan maka jawaban @Joachim Isaksson akan memberi Anda itu - 'perkiraan' karena pembulatan; durasi kurang dari satu detik akan muncul sebagai nol, misalnya. Efek yang sama dapat dilihat dengan stempel waktu yang dilemparkan ke tanggal, yang juga kehilangan pecahan detik:
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;
Jawaban yang lebih akurat dapat ditemukan dengan mengekstrak berbagai komponen cap waktu, seperti dalam pertanyaan yang saya tautkan sebelumnya. Anda mungkin tidak membutuhkan semuanya jika Anda tahu bahwa durasi Anda selalu kurang dari satu jam, katakanlah, tetapi jika Anda membutuhkan lebih dari satu (yaitu jika durasi bisa lebih dari satu menit) maka menggunakan ekspresi tabel umum menengah menyederhanakan banyak hal a sedikit:
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;
Dengan dua baris sampel, satu dengan jarak tepat satu detik dan satu dengan tepat 1,5 detik, ini memberikan hasil 1.25
.