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

Bagaimana menangani pengecualian to_date dalam pernyataan SELECT untuk mengabaikan baris-baris itu?

Sesuai dengan komentar Tony, Anda akan jauh lebih baik menyimpan tanggal di kolom DATE daripada memaksa alat kueri front-end untuk menemukan dan menangani pengecualian ini.

Namun, jika Anda terjebak dengan model data yang salah, opsi paling sederhana di versi sebelumnya adalah membuat fungsi yang melakukan konversi dan menangani kesalahan,

CREATE OR REPLACE FUNCTION my_to_date( p_date_str IN VARCHAR2,
                              p_format_mask IN VARCHAR2 )
  RETURN DATE
IS
  l_date DATE;
BEGIN
  l_date := to_date( p_date_str, p_format_mask );
  RETURN l_date;
EXCEPTION
  WHEN others THEN
    RETURN null;
END my_to_date;

Permintaan Anda kemudian akan menjadi

SELECT * 
  FROM myTable
 WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}

Tentu saja, Anda kemungkinan besar menginginkan indeks berbasis fungsi pada MY_TO_DATE panggilan untuk membuat kueri ini cukup efisien.

Di 12.2, Oracle telah menambahkan ekstensi ke to_date dan cast berfungsi untuk menangani konversi yang error

SELECT * 
  FROM myTable
 WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}

Anda juga dapat menggunakan validate_conversion berfungsi jika Anda mencari semua baris yang (atau bukan) tanggal yang valid.

SELECT *
  FROM myTable 
 WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekspresi Reguler (RegEx) untuk IPv6 Terpisah dari IPv4

  2. Mendapatkan kesalahan ORA - 00907 pada hal berikut di ON UPDATE

  3. Bagaimana saya bisa mempercepat row_number di Oracle?

  4. LOAD DATA INFILE setara di Oracle

  5. Hitung perbedaan antara 2 tanggal / waktu di Oracle SQL