sql >> Databasteknik >  >> RDS >> Oracle

Jämföra med datum i Oracle sql

Problemet är dubbelt. För det första har datumen nästan definitivt tidskomponenter. to_date('06-MAR-11','DD-MON-YY') motsvarar 2011/03/06 00:00:00 . Om du använder TRUNC() funktion kommer du att kunna se allt för den dagen:

select * 
  from test_table
 where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');

Jag skulle inte använd MON datetime-formatmodellen. Som jag förklarar här beror det på din region och inställningar. Det är säkrare att använda en modell med numeriskt månadsformat istället. Ange också alltid århundradet som en del av året.

where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');

Ditt andra problem är nästan definitivt din NLS_DATE_FORMAT; det verkar inte ta hänsyn till tiden, därför ser du fyra identiska datum. Detta styr bara hur data visas inte hur det lagras.

Du kan ändra detta med något som:

ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"

Om jag ställer in en testmiljö med följande:

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 att den returnerade informationen inte inkluderar tid (även om SYSDATE gör det):

SQL> select * from test_table;

CREATION_D
----------
2013/04/12
2013/04/12

Genom att ändra NLS_DATE_FORMAT och utföra samma 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

Slutligen, när du försöker välja dagens datum enbart kommer inga rader att returneras:

SQL> select *
  2    from test_table
  3   where creation_date = to_date('20130412','yyyymmdd');

no rows selected

Men när du använder TRUNC() för att jämföra endast på datumdelen av fältet får du alla dina rader 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

För att faktiskt svara på din andra fråga, om du vill ha unika datum kan du återanvända TRUNC() funktion:

select distinct trunc(creation_date)
  from test_table


  1. Handledning för PL/SQL:Allt du behöver veta om PL/SQL

  2. Spotlight Cloud-stöd för Azure SQL DB Announcement (förhandsgranskning)

  3. Olika db för att testa i Django?

  4. Få maxvärde från rader och gå med i en annan tabell