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

Oracle SQL-sammenligning af DATE'er returnerer forkert resultat

Du sammenligner to STRINGS . Du skal sammenligne DATE s. Som jeg allerede sagde i det andet svar her, skal du lade datoen være som den er for DATO-beregninger. TO_CHAR er til visning og TO_DATE er at konvertere en streng til 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 er også en DATE-kolonne, og derfor vil den have datetime-element. Så hvis du vil udelukke tidselementet, mens du sammenligner, skal du bruge TRUNC

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

Anvendelse af TRUNC på dato kolonnen ville undertrykke ethvert almindeligt indeks på den kolonne. Ud fra et ydeevnesynspunkt er det bedre at bruge en datointervalbetingelse .

For eksempel,

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


  1. ETIMEOUT fejl | Google Cloud SQL-database med NodeJS

  2. MySQL Stored Procedure Permissions

  3. MySQL MIN/MAX returnerer korrekt værdi, men ikke de relaterede postoplysninger

  4. venskabsdatabaseskema