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

Lỗi ngày Oracle trong quá trình cập nhật

CẬP NHẬT:

Tôi không tìm thấy bất kỳ tham chiếu đã xuất bản nào về loại tham nhũng DATE cụ thể này trên trang web hỗ trợ của Oracle. (Nó có thể ở đó, những tìm kiếm nhanh của tôi đã không thành công.)

  • Tập lệnh Baddate để kiểm tra cơ sở dữ liệu cho ngày bị hỏng [ID 95402.1]
  • Lỗi 2790435 - CHÈN nối tiếp với CHỌN song song và chuyển đổi loại có thể chèn dữ liệu bị hỏng [ID 2790435.8]

Đầu ra từ hàm DUMP () đang hiển thị giá trị ngày thực sự không hợp lệ:

Typ=12 Len=7: 120,110,11,18,13,0,16 

Chúng tôi hy vọng rằng byte phút phải là giá trị từ một đến sáu mươi, không phải bằng không.

7 byte của giá trị DATE đại diện theo thứ tự, thế kỷ (+100), năm (+100), tháng, ngày, giờ (+1), phút (+1), giây (+1).

Lần duy nhất tôi thấy các giá trị DATE không hợp lệ như thế này khi giá trị DATE được cung cấp dưới dạng biến liên kết, từ chương trình Pro * C (trong đó giá trị liên kết được cung cấp trong biểu diễn 7 byte bên trong, hoàn toàn bỏ qua các quy trình xác thực thông thường bắt các ngày không hợp lệ, ví dụ:ngày 30 tháng 2)

Không có lý do gì để mong đợi hành vi bạn đang thấy, dựa trên cú pháp Oracle mà bạn đã đăng.

Đây có thể là một dị thường giả (hỏng bộ nhớ?) Hoặc nếu điều này có thể lặp lại, thì đó là một lỗ hổng (lỗi) trong mã Oracle. Nếu đó là một lỗ hổng trong mã Oracle, khả năng bị nghi ngờ nhiều nhất sẽ là các tính năng "mới" trong một bản phát hành chưa được vá.

(Tôi biết CAST là một hàm SQL tiêu chuẩn đã tồn tại lâu đời trong các cơ sở dữ liệu khác. Tôi đoán mình là người cũ và chưa bao giờ đưa nó vào kho cú pháp Oracle của mình. Tôi không biết phiên bản Oracle đó là gì đã giới thiệu CAST, nhưng tôi sẽ tránh xa nó trong bản phát hành đầu tiên mà nó xuất hiện.)

'Lá cờ đỏ' lớn (mà một người bình luận khác đã lưu ý) là CAST( datecol AS DATE) .

Bạn sẽ mong đợi trình tối ưu hóa coi điều đó tương đương với date_col ... nhưng kinh nghiệm trước đây cho chúng tôi thấy rằng TO_NUMBER( number_col ) thực sự được trình tối ưu hóa diễn giải là TO_NUMBER( TO_CHAR ( number_col ) ) .

Tôi nghi ngờ điều gì đó tương tự có thể đang xảy ra với CAST không cần thiết đó.

Dựa trên bản ghi mà bạn đã hiển thị, tôi nghi ngờ vấn đề là với các giá trị có giá trị "59" cho phút hoặc giây và có thể là giá trị "23" cho giờ, sẽ là những thứ hiển thị lỗi.

Tôi sẽ thử kiểm tra những nơi lưu trữ phút, giờ hoặc giây là 0:

SELECT id, DUMP(activitydate)
  FROM newtable
 WHERE DUMP(activitydate) LIKE '%,0,%' 
    OR DUMP(activitydate) LIKE '%,0'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gọi thủ tục được lưu trữ Oracle với VBA bằng cách sử dụng con trỏ

  2. ORA-00913 Lỗi khi sử dụng nhiều câu lệnh IN

  3. Oracle SQL Developer - Cửa sổ kết quả truy vấn bị thiếu lưới

  4. cách thêm hơn 1000 giá trị với mệnh đề NOT IN

  5. JPA Không có hoặc không có khóa chính gặp phải trong đơn vị bản sao công việc