sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL-jämförelse av DATEs returnerar fel resultat

Du jämför två STRINGS . Du måste jämföra DATE s. Som jag redan sa i det andra svaret här, måste du lämna datumet som det är för DATUM-beräkningar. TO_CHAR är för visning och TO_DATE är att konvertera en bokstavlig sträng till 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 är också en DATUM-kolumn, därför kommer den att ha datetime-element. Så om du vill utesluta tidselementet när du jämför, måste du använda TRUNC

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

Använder dock TRUNC på datum kolumnen skulle undertrycka alla vanliga index på den kolumnen. Ur prestandasynpunkt är det bättre att använda ett datumintervallvillkor .

Till exempel,

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


  1. Hur lagrar jag ett UTC ISO8601-datum i en MySQL-databas?

  2. Upptar kolumnerna char / varchar / text / longtext i MySQL full storlek i filsystemet även för delvis fyllda celler?

  3. Hämta information från en Rails-server till en annan

  4. Pythons MySqlDB uppdateras inte rad