Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Porównanie z datą w Oracle sql

Problem jest dwojaki. Po pierwsze, daty prawie na pewno mają elementy czasowe. to_date('06-MAR-11','DD-MON-YY') jest odpowiednikiem 2011/03/06 00:00:00 . Jeśli używasz TRUNC() dzięki funkcji będziesz mógł zobaczyć wszystko na ten dzień:

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

nie użyj modelu formatu daty i godziny MON. Jak wyjaśniam tutaj, zależy to od regionu i ustawień. Bezpieczniej jest zamiast tego użyć liczbowego modelu formatu miesiąca. Podobnie zawsze podawaj wiek jako część roku.

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

Twój drugi problem to prawie na pewno Twój NLS_DATE_FORMAT; wydaje się, że nie bierze pod uwagę czasu, dlatego widzisz 4 identyczne daty. To reguluje tylko sposób, w jaki dane są wyświetlane nie tak, jak jest przechowywany.

Możesz to zmienić, używając czegoś takiego:

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

Jeśli skonfiguruję środowisko testowe w następujący sposób:

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

Możesz zobaczyć, że zwrócone dane nie obejmują czasu (chociaż SYSDATE tak):

SQL> select * from test_table;

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

Zmieniając NLS_DATE_FORMAT i wykonując ten sam SELECT, otrzymujesz teraz składnik czasu:

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

Wreszcie, podczas próby wybrania samej dzisiejszej daty żadne wiersze nie zostaną zwrócone:

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

no rows selected

Ale kiedy używasz TRUNC() aby porównać tylko część pola dotyczącą daty, ponownie otrzymasz wszystkie wiersze:

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

Aby faktycznie odpowiedzieć na drugie pytanie, jeśli chcesz mieć unikalne daty, możesz ponownie użyć TRUNC() funkcja:

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. Kursor For Loop z dynamiczną instrukcją SQL

  2. Wyłączanie i uruchamianie instancji Oracle

  3. Jaki jest powód / użyteczność użycia słowa kluczowego ENABLE w instrukcjach bazy danych Oracle?

  4. Wywołaj funkcję pl/sql w javie?

  5. Błąd SQL:tabela lub widok ORA-00942 nie istnieje