sql >> Databáze >  >> RDS >> Oracle

Porovnání s datem v Oracle sql

Problém je dvojí. Za prvé, data téměř určitě mají časové složky. to_date('06-MAR-11','DD-MON-YY') je ekvivalentní 2011/03/06 00:00:00 . Pokud použijete TRUNC() budete moci vidět vše pro daný den:

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

Ne bych použijte model formátu data a času MON. Jak zde vysvětluji, záleží na vaší oblasti a nastavení. Místo toho je bezpečnější použít číselný model ve formátu měsíce. Stejně tak vždy určete století jako součást roku.

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

Váš druhý problém je téměř určitě váš NLS_DATE_FORMAT; zdá se, že nebere v úvahu čas, proto vidíte 4 stejná data. Tím se řídí pouze způsob, jakým jsou data zobrazována ne jak je uložen.

Můžete to změnit pomocí něčeho jako:

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

Pokud nastavím testovací prostředí pomocí následujícího:

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

Můžete vidět, že vrácená data nezahrnují čas (ačkoli SYSDATE ano):

SQL> select * from test_table;

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

Změnou NLS_DATE_FORMAT a provedením stejného SELECT nyní získáte časovou složku:

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

A konečně, když se pokusíte vybrat pouze dnešní datum, nebudou vráceny žádné řádky:

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

no rows selected

Ale při použití TRUNC() pro porovnání pouze s datovou částí pole získáte znovu všechny své řádky:

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

Chcete-li skutečně odpovědět na svou druhou otázku, pokud chcete jedinečná data, můžete znovu použít TRUNC() funkce:

select distinct trunc(creation_date)
  from test_table


  1. Několik oblastí vylepšení v PostgreSQL 9.4

  2. Jak mohu popsat tabulku v Oracle bez použití příkazu DESCRIBE?

  3. Uložte výstup PL/pgSQL z PostgreSQL do souboru CSV

  4. Jak převést datum a čas na UTC v MySQL