报错‘FROM keyword not found where expected’:如何用TO_CHAR高效查询昨日日期?
解决SQL报错+高效查询昨日数据的方案
咱们先拆解你遇到的问题,再给出适配不同数据库的解决方案:
原SQL的错误原因
你碰到的“FROM keyword not found where expected”报错,主要是两个问题:
- 漏了FROM子句:SQL查询必须明确指定要从哪个表取数据,你的语句里完全没写
FROM 你的表名这部分,数据库根本不知道去哪找数据。 - WHERE子句位置错了:WHERE条件应该放在SELECT字段之后、GROUP BY(因为用到了sum聚合函数,必须分组)之前,你把它插在字段定义中间,语法完全不对。
修正+适配昨日查询的SQL(分数据库)
因为不同数据库获取昨日日期的语法不一样,下面给你主流数据库的实现,同时修正原SQL的语法问题:
Oracle版本
Oracle里用SYSDATE - 1就能拿到昨日日期,另外用TRUNC函数可以忽略日期字段的时间部分,确保匹配昨日全天的数据:
SELECT REPLACE(CM_NAME, '/', ' ') as CM_NAME, TO_CHAR(Booking_Date,'MM/DD/YYYY') AS Booking_Date, sum(Air_Revenue) as TTL_AIRFARE, sum(Room_Revenue) as TTL_ROOM, sum(Car_Revenue) AS TTL_CAR, sum(Activity_Revenue) as TTL_ACTIVITY, 0 as TTL_CRUISE FROM 你的实际表名 -- 一定要换成你要查的表的名字 WHERE TRUNC(Booking_Date) = TRUNC(SYSDATE - 1) GROUP BY REPLACE(CM_NAME, '/', ' '), TO_CHAR(Booking_Date,'MM/DD/YYYY')
要是你的Booking_Date字段本身就只有日期、没有时间,那可以把
TRUNC去掉,直接写Booking_Date = SYSDATE - 1就行。
MySQL版本
MySQL用CURDATE() - INTERVAL 1 DAY获取昨日日期,日期格式化用DATE_FORMAT替代Oracle的TO_CHAR:
SELECT REPLACE(CM_NAME, '/', ' ') as CM_NAME, DATE_FORMAT(Booking_Date,'%m/%d/%Y') AS Booking_Date, sum(Air_Revenue) as TTL_AIRFARE, sum(Room_Revenue) as TTL_ROOM, sum(Car_Revenue) AS TTL_CAR, sum(Activity_Revenue) as TTL_ACTIVITY, 0 as TTL_CRUISE FROM 你的实际表名 WHERE DATE(Booking_Date) = CURDATE() - INTERVAL 1 DAY GROUP BY REPLACE(CM_NAME, '/', ' '), DATE_FORMAT(Booking_Date,'%m/%d/%Y')
SQL Server版本
SQL Server用DATEADD(day, -1, GETDATE())拿昨日日期,格式化日期用CONVERT函数(101对应MM/DD/YYYY格式):
SELECT REPLACE(CM_NAME, '/', ' ') as CM_NAME, CONVERT(varchar, Booking_Date, 101) AS Booking_Date, sum(Air_Revenue) as TTL_AIRFARE, sum(Room_Revenue) as TTL_ROOM, sum(Car_Revenue) AS TTL_CAR, sum(Activity_Revenue) as TTL_ACTIVITY, 0 as TTL_CRUISE FROM 你的实际表名 WHERE CAST(Booking_Date AS date) = CAST(DATEADD(day, -1, GETDATE()) AS date) GROUP BY REPLACE(CM_NAME, '/', ' '), CONVERT(varchar, Booking_Date, 101)
小优化建议
- 别用
DISTINCT了,因为你用到了sum这类聚合函数,用GROUP BY分组后自然会得到唯一的CM_NAME和Booking_Date组合,逻辑更清晰。 - 匹配日期时尽量用数据库原生的日期函数处理(比如TRUNC、DATE、CAST),别用字符串转换来匹配,这样查询效率更高,还能避免日期格式不一致导致的匹配错误。
内容的提问来源于stack exchange,提问作者Kamran Malik
相关产品推荐
相关产品推荐

