sql >> Database teknologi >  >> RDS >> Oracle

Sammenligning med dato i Oracle sql

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


  1. Find en forælder på øverste niveau i SQL

  2. Hvad er den bedste praksis for at bruge en GUID som en primær nøgle, specifikt med hensyn til ydeevne?

  3. Giv valg på alle borde, der ejes af en bestemt bruger

  4. Sådan rejser du en fejl i en MySQL-funktion