Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Vergleich mit dem Datum in Oracle SQL

Das Problem ist zweierlei. Erstens haben die Daten fast definitiv Zeitkomponenten. to_date('06-MAR-11','DD-MON-YY') entspricht 2011/03/06 00:00:00 . Wenn Sie den TRUNC() verwenden Funktion können Sie alles für diesen Tag sehen:

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

Ich würde nicht Verwenden Sie das MON-Datetime-Formatmodell. Wie ich hier erkläre, hängt es von Ihrer Region und Ihren Einstellungen ab. Es ist sicherer, stattdessen ein numerisches Monatsformatmodell zu verwenden. Geben Sie außerdem das Jahrhundert immer als Teil des Jahres an.

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

Ihr zweites Problem ist fast definitiv Ihr NLS_DATE_FORMAT; Es scheint die Zeit nicht zu berücksichtigen, weshalb Sie 4 identische Daten sehen. Dies regelt nur die Art und Weise, wie Daten angezeigt werden nicht wie es gespeichert wird.

Sie können dies ändern, indem Sie Folgendes verwenden:

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

Wenn ich eine Testumgebung mit folgendem einrichte:

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

Sie können sehen, dass die zurückgegebenen Daten keine Zeit enthalten (obwohl SYSDATE dies tut):

SQL> select * from test_table;

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

Wenn Sie das NLS_DATE_FORMAT ändern und dasselbe SELECT ausführen, erhalten Sie jetzt eine Zeitkomponente:

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

Wenn Sie schließlich versuchen, nur das heutige Datum auszuwählen, werden keine Zeilen zurückgegeben:

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

no rows selected

Aber bei Verwendung von TRUNC() Um nur den Datumsteil des Feldes zu vergleichen, erhalten Sie alle Ihre Zeilen erneut:

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

Um Ihre zweite Frage tatsächlich zu beantworten:Wenn Sie eindeutige Daten wünschen, können Sie TRUNC() wiederverwenden Funktion:

select distinct trunc(creation_date)
  from test_table