Problemet er todelt. For det første har datoerne næsten helt sikkert tidskomponenter. to_date('06-MAR-11','DD-MON-YY')
svarer til 2011/03/06 00:00:00
. Hvis du bruger TRUNC()
funktion vil du være i stand til at se alt for den dag:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
Jeg ville ikke brug MON dato- og tidsformatmodellen. Som jeg forklarer her, afhænger det af din region og dine indstillinger. Det er mere sikkert at bruge en model med numerisk månedsformat i stedet. Angiv altid århundrede som en del af året.
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
Dit andet problem er næsten helt sikkert din NLS_DATE_FORMAT; det ser ud til ikke at tage højde for tidspunktet, hvorfor du ser 4 identiske datoer. Dette styrer kun den måde, hvorpå data vises ikke hvordan det opbevares.
Du kan ændre dette ved at bruge noget som:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
Hvis jeg opsætter et testmiljø ved hjælp af følgende:
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";
Du kan se, at de returnerede data ikke inkluderer tid (selvom SYSDATE gør):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
Hvis du ændrer NLS_DATE_FORMAT og udfører det samme SELECT, får du nu en tidskomponent:
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
Til sidst, når du prøver at vælge dagens dato alene, returneres ingen rækker:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
Men når du bruger TRUNC()
for kun at sammenligne på datodelen af feltet får du alle dine rækker igen:
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
For faktisk at besvare dit andet spørgsmål, hvis du ønsker unikke datoer, kan du genbruge TRUNC()
funktion:
select distinct trunc(creation_date)
from test_table