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

Oracle sql Kurangi antara dua tanggal

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kembalikan Baris yang Mengandung Nilai Numerik di Oracle

  2. Cara membuat pengguna di pengembang Oracle SQL

  3. Cara Mengekspor Hasil Kueri ke File CSV di SQLcl (Oracle)

  4. Pemicu Mutasi Oracle

  5. Bagaimana saya bisa menemukan kolom dan nama tabel yang mendasari untuk tampilan Oracle?