Oracle
 sql >> база данни >  >> RDS >> Oracle

Сравняване с дата в Oracle sql

Проблемът е двоен. Първо, датите почти определено имат времеви компоненти. to_date('06-MAR-11','DD-MON-YY') е еквивалентен на 2011/03/06 00:00:00 . Ако използвате TRUNC() функция ще можете да видите всичко за този ден:

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

Аз не бих използвайте модела за формат за дата и час MON. Както обяснявам тук, зависи от вашия регион и настройки. Вместо това е по-безопасно да използвате модел с цифров формат за месец. Също така винаги посочвайте век като част от годината.

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

Вторият ви проблем почти определено е вашият NLS_DATE_FORMAT; изглежда не отчита часа, следователно защо виждате 4 еднакви дати. Това урежда само начина, по който данните се показват не как се съхранява.

Можете да промените това, като използвате нещо като:

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

Ако настроя тестова среда, използвайки следното:

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

Можете да видите, че върнатите данни не включват време (въпреки че SYSDATE го прави):

SQL> select * from test_table;

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

Променяйки NLS_DATE_FORMAT и изпълнявайки същия SELECT, сега получавате времеви компонент:

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

И накрая, когато се опитвате да изберете само днешната дата, няма да бъдат върнати редове:

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

no rows selected

Но когато използвате TRUNC() за да сравните само частта с дата от полето, получавате отново всичките си редове:

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

За да отговорите на втория си въпрос, ако искате уникални дати, можете да използвате повторно TRUNC() функция:

select distinct trunc(creation_date)
  from test_table


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PARTITION BY с и без KEEP в Oracle

  2. Как вашият Oracle ODBC драйвер зарежда клиента на Oracle?

  3. Java - намерете първата причина за изключение

  4. Деклариране и задаване на променливи в оператор Select

  5. Изпълняване на съхранена процедура в SQL Developer?