sql >> Database >  >> RDS >> Oracle

Vergelijken met datum in Oracle sql

Het probleem is tweeledig. Ten eerste hebben de datums vrijwel zeker tijdcomponenten. to_date('06-MAR-11','DD-MON-YY') komt overeen met 2011/03/06 00:00:00 . Als u de TRUNC() . gebruikt functie kunt u alles voor die dag zien:

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

Ik zou niet gebruik het MON datetime-formaatmodel. Zoals ik hier uitleg, hangt het af van je regio en instellingen. Het is veiliger om in plaats daarvan een numeriek maandformaat te gebruiken. Geef ook altijd de eeuw op als deel van het jaar.

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

Uw tweede probleem is vrijwel zeker uw NLS_DATE_FORMAT; het lijkt geen rekening te houden met de tijd, vandaar dat je 4 identieke datums ziet. Dit regelt alleen de manier waarop gegevens worden weergegeven niet hoe het is opgeslagen.

Je kunt dit veranderen met iets als:

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

Als ik een testomgeving opzet met het volgende:

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";

U kunt zien dat de geretourneerde gegevens geen tijd bevatten (hoewel SYSDATE dat wel doet):

SQL> select * from test_table;

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

Als u de NLS_DATE_FORMAT wijzigt en dezelfde SELECT uitvoert, krijgt u nu een tijdcomponent:

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

Ten slotte, wanneer u alleen de datum van vandaag probeert te selecteren, worden er geen rijen geretourneerd:

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

no rows selected

Maar bij gebruik van TRUNC() om alleen het datumgedeelte van het veld te vergelijken, krijgt u al uw rijen opnieuw:

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

Om uw tweede vraag daadwerkelijk te beantwoorden:als u unieke datums wilt, kunt u de TRUNC() opnieuw gebruiken functie:

select distinct trunc(creation_date)
  from test_table


  1. SQL Server voorwaardelijke stroom

  2. Best practice voor losse koppeling tussen gegevens en gebruikersinterface in Android - Adapter, Filter, CursorLoader en ContentProvider

  3. Oracle naar PostgreSQL:BEGIN MET/VERBIND DOOR

  4. Hoe SCHEMA_ID() werkt in SQL Server