sql >> Database teknologi >  >> RDS >> Oracle

Oracle-dato mellem forespørgsel

At dømme ud fra dit output ser det ud til, at du har defineret START_DATE som et tidsstempel. Hvis det var en almindelig dato, ville Oracle være i stand til at håndtere den implicitte konvertering. Men da det ikke er, behøver du eksplicit at støbe disse strenge til datoer.

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> 

Men vi får stadig kun én række. Dette skyldes, at START_DATE har et tidselement. Hvis vi ikke angiver tidskomponenten, indstiller Oracle den som standard til midnat. Det er fint for fra siden af ​​BETWEEN men ikke for indtil side:

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>

rediger

Hvis du ikke kan bestå tidskomponenten, er der et par valgmuligheder. Den ene er at ændre WHERE-sætningen for at fjerne tidselementet fra kriterierne:

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

Dette kan have en indvirkning på ydeevnen, fordi det diskvalificerer ethvert b-træ-indeks på START_DATE. Du skal i stedet bygge et funktionsbaseret indeks.

Alternativt kan du tilføje tidselementet til datoen i din kode:

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

På grund af disse problemer foretrækker mange mennesker at undgå brugen af ​​between ved at tjekke for datogrænser som denne:

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


  1. Login flow i R12.2 og grundlæggende fejlfinding

  2. Anbringelse af markørdata i et array

  3. MariaDB JSON_SEARCH() Forklaret

  4. Sådan opretter du en navigationsformular i Microsoft Access