Vấn đề là gấp đôi. Thứ nhất, ngày gần như chắc chắn có thành phần thời gian. to_date('06-MAR-11','DD-MON-YY')
tương đương với 2011/03/06 00:00:00
. Nếu bạn sử dụng TRUNC()
bạn sẽ có thể xem mọi thứ cho ngày hôm đó:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
Tôi sẽ không sử dụng mô hình định dạng ngày giờ MON. Như tôi giải thích ở đây, nó phụ thuộc vào khu vực và cài đặt của bạn. Thay vào đó, sử dụng mô hình định dạng tháng số sẽ an toàn hơn. Tương tự, luôn chỉ định thế kỷ là một phần của năm.
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
Vấn đề thứ hai của bạn gần như chắc chắn là NLS_DATE_FORMAT của bạn; nó dường như không tính đến thời gian, do đó tại sao bạn thấy 4 ngày giống nhau. Điều này chỉ chi phối cách thức mà dữ liệu được hiển thị không phải cách nó được lưu trữ.
Bạn có thể thay đổi điều này bằng cách sử dụng một cái gì đó như:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
Nếu tôi thiết lập môi trường thử nghiệm bằng cách sử dụng như sau:
create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";
Bạn có thể thấy dữ liệu trả về không bao gồm thời gian (mặc dù SYSDATE thì có):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
Thay đổi NLS_DATE_FORMAT và thực hiện cùng một CHỌN, bây giờ bạn nhận được một thành phần thời gian:
SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";
Session altered.
SQL> select * from test_table;
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
Cuối cùng, khi cố gắng chỉ chọn ngày hôm nay, sẽ không có hàng nào được trả lại:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
Tuy nhiên, khi sử dụng TRUNC()
để so sánh chỉ vào phần ngày của trường, bạn sẽ nhận lại được tất cả các hàng của mình:
SQL> select *
2 from test_table
3 where trunc(creation_date) = to_date('20130412','yyyymmdd');
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
Để thực sự trả lời câu hỏi thứ hai của bạn, nếu bạn muốn có ngày duy nhất, bạn có thể sử dụng lại TRUNC()
chức năng:
select distinct trunc(creation_date)
from test_table