Đánh giá từ kết quả đầu ra của bạn, có vẻ như bạn đã xác định START_DATE làm dấu thời gian. Nếu đó là một ngày bình thường thì Oracle sẽ có thể xử lý việc chuyển đổi ngầm định. Nhưng vì nó không phải là bạn cần phải truyền các chuỗi đó thành ngày tháng một cách rõ ràng.
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
Nhưng chúng tôi vẫn chỉ nhận được một hàng. Điều này là do START_DATE có yếu tố thời gian. Nếu chúng ta không chỉ định thành phần thời gian thì Oracle sẽ mặc định nó là nửa đêm. Điều đó tốt cho từ mặt của BETWEEN
nhưng không phải cho cho đến khi bên:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
chỉnh sửa
Nếu bạn không thể vượt qua thành phần thời gian, có một số lựa chọn. Một là thay đổi mệnh đề WHERE để loại bỏ yếu tố thời gian khỏi tiêu chí:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
Điều này có thể có tác động đến hiệu suất, vì nó loại bỏ bất kỳ chỉ mục b-tree nào vào START_DATE. Thay vào đó, bạn sẽ cần phải xây dựng một chỉ mục dựa trên chức năng.
Ngoài ra, bạn có thể thêm yếu tố thời gian vào ngày trong mã của mình:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
Do những vấn đề này, nhiều người muốn tránh sử dụng between
bằng cách kiểm tra các ranh giới ngày như sau:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')