Проблемът е двоен. Първо, датите почти определено имат времеви компоненти. to_date('06-MAR-11','DD-MON-YY')
е еквивалентен на 2011/03/06 00:00:00
. Ако използвате TRUNC()
функция ще можете да видите всичко за този ден:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
Аз не бих използвайте модела за формат за дата и час MON. Както обяснявам тук, зависи от вашия регион и настройки. Вместо това е по-безопасно да използвате модел с цифров формат за месец. Също така винаги посочвайте век като част от годината.
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
Вторият ви проблем почти определено е вашият NLS_DATE_FORMAT; изглежда не отчита часа, следователно защо виждате 4 еднакви дати. Това урежда само начина, по който данните се показват не как се съхранява.
Можете да промените това, като използвате нещо като:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
Ако настроя тестова среда, използвайки следното:
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";
Можете да видите, че върнатите данни не включват време (въпреки че SYSDATE го прави):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
Променяйки NLS_DATE_FORMAT и изпълнявайки същия SELECT, сега получавате времеви компонент:
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
И накрая, когато се опитвате да изберете само днешната дата, няма да бъдат върнати редове:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
Но когато използвате TRUNC()
за да сравните само частта с дата от полето, получавате отново всичките си редове:
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
За да отговорите на втория си въпрос, ако искате уникални дати, можете да използвате повторно TRUNC()
функция:
select distinct trunc(creation_date)
from test_table