sql >> Database >  >> RDS >> Oracle

Oracle-datum tussen zoekopdracht

Afgaand op je output lijkt het alsof je START_DATE als tijdstempel hebt gedefinieerd. Als het een normale datum zou zijn, zou Oracle de impliciete conversie aankunnen. Maar aangezien dat niet het geval is, moet je die strings expliciet casten als datums.

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> 

Maar we krijgen nog steeds maar één rij. Dit komt omdat START_DATE een tijdselement heeft. Als we de tijdcomponent niet specificeren, stelt Oracle deze standaard in op middernacht. Dat is prima voor de van kant van de BETWEEN maar niet voor de tot kant:

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>

bewerken

Als je het tijdsonderdeel niet kunt halen, zijn er een aantal keuzes. Een daarvan is om de WHERE-component te wijzigen om het tijdelement uit de criteria te verwijderen:

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

Dit kan een impact hebben op de prestaties, omdat het elke b-tree-index diskwalificeert op START_DATE. U zou in plaats daarvan een op functies gebaseerde index moeten bouwen.

U kunt ook het tijdselement toevoegen aan de datum in uw code:

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

Vanwege deze problemen vermijden veel mensen het gebruik van between door te controleren op datumgrenzen als volgt:

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


  1. MaxScale Basic Management MaxCtrl gebruiken voor MariaDB Cluster

  2. 6 manieren om dubbele rijen in SQLite te selecteren

  3. Gebruik samengestelde primaire sleutel als externe sleutel

  4. Gegevens bijwerken in een aangepast dialoogvenster