Home > database >  Unknown database function 'DATE_FORMAT' in OracleDb
Unknown database function 'DATE_FORMAT' in OracleDb

Time:09-16

Below is how my BUS_DATA table looks like

enter image description here

Below is my query where for a single day it picks the maximum currentSpeed and returns that row for the busId selected

SELECT busId, busName, passengersNo, speedLimit, dataDateTime, DATE_FORMAT(dataDateTime, '%Y-%m-%d') dataDate , max(currentSpeed) currentSpeed from BUS_DATA where busId = '4-3323309834' GROUP BY busId, dataDate

Below is how this query looks like when it runs

enter image description here

This was all working well when i was using MySQL until when i migrated to Oracle RDBMS where i am getting below errors


Unknown database function 'DATE_FORMAT'

Column 'busName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

Column 'passengersNo' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

Column 'speedLimit' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

Column 'speedLimit' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

I have tried to modify DATE_FORMAT to to_char(dataDateTime, 'YYYY-MM-DD') and making the query to look like below but its still showing errors how can i convert the above query to Oracle RDBMS


SELECT busId, busName, passengersNo, speedLimit, dataDateTime, to_char(dataDateTime, 'YYYY-MM-DD') dataDate ,
  max(currentSpeed) currentSpeed from BUS_DATA where busId = '4-3323309834' GROUP BY busId, dataDate

dataDateTime field in my table is Timestamp

CodePudding user response:

When you use GROUP BY you either need to include the column in the GROUP BY clause or you need to use an aggregation function and you cannot use an alias declared in the SELECT clause in the GROUP BY clause:

SELECT busId,
       to_char(dataDateTime, 'YYYY-MM-DD') AS dataDate,
       max(currentSpeed) AS currentSpeed
from   BUS_DATA
where  busId = '4-3323309834'
GROUP BY
       busId,
       to_char(dataDateTime, 'YYYY-MM-DD')

If you want to add more columns then:

SELECT busId,
       busName,
       passengersNo,
       speedLimit,
       dataDateTime,
       to_char(dataDateTime, 'YYYY-MM-DD') AS dataDate ,
       max(currentSpeed) AS currentSpeed
from   BUS_DATA
where  busId = '4-3323309834'
GROUP BY
       busId,
       busName,
       passengersNo,
       speedLimit,
       dataDateTime

or:

SELECT busId,
       MAX(busName) AS busName,
       MAX(passengersNo) AS passengerNo,
       MAX(speedLimit) AS speedLimit,
       MAX(dataDateTime) AS dateDateTime,
       to_char(dataDateTime, 'YYYY-MM-DD') AS dataDate ,
       max(currentSpeed) AS currentSpeed
from   BUS_DATA
where  busId = '4-3323309834'
GROUP BY
       busId,
       to_char(dataDateTime, 'YYYY-MM-DD')

or don't use GROUP BY:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY busId, to_char(dataDateTime, 'YYYY-MM-DD')
           ORDER BY currentSpeed DESC
         ) AS rn
  from   BUS_DATA t
  where  busId = '4-3323309834'
)
WHERE rn = 1;
  • Related