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

Oracle datum mezi dotazem

Podle vašeho výstupu to vypadá, že jste definovali START_DATE jako časové razítko. Pokud by to bylo běžné datum, Oracle by byl schopen zvládnout implicitní převod. Ale protože tomu tak není, musíte tyto řetězce explicitně přetypovat na data.

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000    

SQL> 

Ale stále máme jen jeden řádek. Důvodem je, že START_DATE má prvek času. Pokud neurčíme časovou složku, Oracle ji nastaví na půlnoc. To je v pořádku pro od straně BETWEEN ale ne do strana:

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') 
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

upravit

Pokud nemůžete přejít v časové složce, existuje několik možností. Jedním z nich je změnit klauzuli WHERE tak, aby se z kritérií odstranil prvek času:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

To může mít dopad na výkon, protože to START_DATE diskvalifikuje jakýkoli index b-stromu. Místo toho byste museli vytvořit index založený na funkcích.

Případně můžete přidat prvek času k datu ve vašem kódu:

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

Kvůli těmto problémům se mnoho lidí raději vyhýbá použití between tak, že zkontrolujete hranice data takto:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')


  1. Jak ladit překročení časového limitu čekání na zámek na MySQL?

  2. Jak se spouštějí paralelní plány – část 3

  3. Jaký je rozdíl mezi vazebnými proměnnými a substitučními proměnnými (které zadám pomocí &&)?

  4. Vkládání do MySQL z PHP (jQuery/AJAX)