Reputation: 1667
Using below query in Android Room :
@Query(
"SELECT strftime ('%d-%m-%Y', datetime(DISTINCT timeStamp, 'unixepoch', 'localtime')) AS e.name " +
"FROM (SELECT batteryDetails.*, " +
"COUNT(logId) OVER" +
"(PARTITION BY batteryId) AS oldStatus " +
"from batteryDetails) batteryDetails " +
"LEFT JOIN eventTypes e ON e.eventType = batteryDetails.status " +
"WHERE oldStatus is null OR oldStatus <> status AND batteryId = :batteryId AND " +
"timeStamp between :startDate AND :endDate " +
"ORDER BY timeStamp DESC"
)
suspend fun getHistoryEventsData(
batteryId: String,
startDate: String,
endDate: String
): List<String>?
getHistoryEventsData is a function
This Query is running successfully in SQLite db browser.
But it giving me below error while running app :
error: extraneous input '.' expecting {, ';', K_ALTER, K_ANALYZE, K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, K_END, K_EXPLAIN, K_INSERT, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR} public abstract java.lang.Object getHistoryEventsData(@org.jetbrains.annotations.NotNull() ^ extraneous input '(' expecting {, ';', K_ALTER, K_ANALYZE, K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, K_END, K_EXPLAIN, K_INSERT, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}
What might be the Issue?
My SQLite version is 3.28.0 and using roomRuntime=3.2.0
Upvotes: 0
Views: 1928
Reputation: 164064
There are 2 syntactical errors in your query.
The 1st is the use of the keyword DISTINCT
inside the function strftime()
(this is actually allowed by SQLite but does not behave like it should). Maybe you want it before the function.
The 2nd is that you use the alias e
to qualify the name of the column alias name
in its definition. The definition of an alias should not be qualified.
Change to this:
SELECT DISTINCT strftime('%d-%m-%Y', datetime(timeStamp, 'unixepoch', 'localtime')) AS name
FROM (
SELECT batteryDetails.*,
COUNT(logId) OVER(PARTITION BY batteryId) AS oldStatus
from batteryDetails
) batteryDetails
LEFT JOIN eventTypes e ON e.eventType = batteryDetails.status
WHERE oldStatus is null OR oldStatus <> status
AND batteryId = :batteryId
AND timeStamp between :startDate AND :endDate
ORDER BY timeStamp DESC;
Also, this:
strftime('%d-%m-%Y', datetime(timeStamp, 'unixepoch', 'localtime'))
could be simplified to:
strftime('%d-%m-%Y', timeStamp, 'unixepoch', 'localtime')
Upvotes: 1