Bạn đang yêu cầu các phương pháp hay nhất. Tôi nghĩ những điều sau đây là phương pháp hay nhất:
"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Đầu tiên, hãy lưu ý việc sử dụng DATE
từ khóa. Câu hỏi của bạn là về ngày tháng và bạn đang sử dụng định dạng ngày tháng mà Oracle không hỗ trợ trực tiếp. Rất vui, Oracle hỗ trợ tiêu chuẩn ANSI DATE
từ khóa với định dạng tiêu chuẩn ISO.
Thứ hai, tôi đã thêm một +1
để bạn có thể thấy khoảng thời gian kết thúc, có lẽ là khoảng thời gian bạn muốn xem trong mã. Nó sẽ không ảnh hưởng đến hiệu suất vì + 1
là một hằng số.
Thứ ba, hằng số ngày có một thành phần thời gian. Khi không có gì được chỉ định, đó là nửa đêm của ngày. Vì vậy, biểu thức:
"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Thực sự là:
"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Có nghĩa là, chính xác một thời gian kể từ ngày sau đó được bao gồm, tức thời gian đầu tiên vào lúc nửa đêm. Đây thường không phải là điều bạn muốn. Oracle làm cho vấn đề này trở nên tồi tệ hơn theo hai cách:
-
date
kiểu dữ liệu bao gồm một thành phần thời gian. - Cách trình bày
date
mặc định giá trị không có thành phần thời gian.
Vì vậy, để an toàn nhất, hãy sử dụng các quy tắc sau:
- Không sử dụng
between
vào các ngày. - Sử dụng
>=
cho buổi hẹn hò đầu tiên. - Người dùng
<
cho lần thứ hai.
Aaron Bertrand có một blog
về chính xác chủ đề này. Mặc dù nó nói riêng về SQL Server, nhiều ý tưởng áp dụng cho Oracle - đặc biệt là vì date
kiểu dữ liệu trong Oracle bao gồm thời gian.