Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để xử lý các ngoại lệ to_date trong trạng thái SELECT để bỏ qua các hàng đó?

Nhắc lại nhận xét của Tony, tốt hơn hết bạn nên lưu trữ ngày tháng trong các cột DATE hơn là buộc công cụ truy vấn giao diện người dùng phải tìm và xử lý những trường hợp ngoại lệ này.

Tuy nhiên, nếu bạn gặp khó khăn với mô hình dữ liệu không chính xác, tùy chọn đơn giản nhất trong các phiên bản trước đó là tạo một hàm thực hiện chuyển đổi và xử lý lỗi,

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;

Truy vấn của bạn sau đó sẽ trở thành

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

Tất nhiên, bạn rất có thể muốn có một chỉ mục dựa trên hàm vào MY_TO_DATE gọi để làm cho truy vấn này hiệu quả một cách hợp lý.

Trong 12.2, Oracle đã thêm các phần mở rộng vào to_datecast các chức năng để xử lý các chuyển đổi bị lỗi

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

Bạn cũng có thể sử dụng validate_conversion hoạt động nếu bạn đang tìm kiếm tất cả các hàng có (hoặc không phải) ngày hợp lệ.

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. 12c Kế hoạch thích ứng trong nhà phát triển SQL

  2. Сtạo máy ảo với hộp ảo Oracle VM

  3. Cách nhanh chóng để tạo các chuỗi được nối trong Oracle

  4. Làm cách nào để thêm số 0 đứng đầu trong một số trong truy vấn SQL của Oracle?

  5. Thứ tự tùy chỉnh trong Oracle SQL