sql >> Database >  >> RDS >> Oracle

Oracle SQL-vergelijking van DATE's geeft een verkeerd resultaat

Je vergelijkt twee STRINGS . U moet de DATUM . vergelijken s. Zoals ik al zei in het andere antwoord hier, moet u de datum laten zoals deze is voor DATE-berekeningen. TO_CHAR is voor weergave, en TO_DATE is om een ​​letterlijke tekenreeks om te zetten in DATE.

SELECT TO_CHAR(REPORTDATE, 'DD.MM.YYYY'),
  COUNT(*)
FROM TABLE
WHERE REPORTDATE > TO_DATE('09.11.2013', 'DD.MM.YYYY')
GROUP BY TO_CHAR(REPORTDATE, 'DD.MM.YYYY') 

REPORTDATE is ook een DATE-kolom, dus het zal een datetime-element hebben. Dus als u het tijdselement wilt uitsluiten tijdens het vergelijken, moet u TRUNC . gebruiken

WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')

Echter, het toepassen van TRUNC op de datum kolom zou elke reguliere index onderdrukken op die kolom. Gebruik vanuit prestatieoogpunt beter een Datumbereikvoorwaarde .

Bijvoorbeeld,

WHERE REPORTDATE
BETWEEN 
        TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND     
        TO_DATE('09.11.2013', 'DD.MM.YYYY') +1


  1. querycache werkt niet

  2. ORACLE:GEEN GEGEVENS GEVONDEN -- maar er zijn wel gegevens

  3. Bij INSERT naar een tabel INSERT data in verbonden tabellen

  4. SQL Query-optimalisatie - exec-tijd