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

Oracle SQL so sánh DATEs trả về kết quả sai

Bạn đang so sánh hai STRINGS . Bạn cần so sánh DATE S. Như tôi đã nói trong câu trả lời khác ở đây, bạn cần giữ nguyên ngày cho phép tính DATE. TO_CHAR dành cho hiển thị và TO_DATE là chuyển đổi một chuỗi ký tự thành DATE.

SELECT TO_CHAR(REPORTDATE, 'DD.MM.YYYY'),
  COUNT(*)
FROM TABLE
WHERE REPORTDATE > TO_DATE('09.11.2013', 'DD.MM.YYYY')
GROUP BY TO_CHAR(REPORTDATE, 'DD.MM.YYYY') 

Ngoài ra, REPORTDATE là cột DATE, do đó nó sẽ có phần tử datetime. Vì vậy, nếu bạn muốn loại trừ yếu tố thời gian trong khi so sánh, bạn cần sử dụng TRUNC

WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')

Tuy nhiên, việc áp dụng TRUNC vào ngày cột sẽ ngăn chặn bất kỳ chỉ mục thông thường nào trên cột đó. Từ quan điểm hiệu suất, tốt hơn hãy sử dụng Điều kiện phạm vi ngày .

Ví dụ:

WHERE REPORTDATE
BETWEEN 
        TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND     
        TO_DATE('09.11.2013', 'DD.MM.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. Độ chính xác của khoảng thời gian cho giá trị hàm PL / SQL

  2. Tại sao ddl tĩnh không được phép trong PL / SQL?

  3. Làm cách nào để sử dụng Hibernate Session.doWork (...) cho các điểm lưu / giao dịch lồng nhau?

  4. Lỗi SQL:ORA-14006:tên phân vùng không hợp lệ

  5. Oracle - Bảng sao chép - Cấu trúc, ràng buộc dữ liệu và tất cả