You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

报错‘FROM keyword not found where expected’:如何用TO_CHAR高效查询昨日日期?

解决SQL报错+高效查询昨日数据的方案

咱们先拆解你遇到的问题,再给出适配不同数据库的解决方案:

原SQL的错误原因

你碰到的“FROM keyword not found where expected”报错,主要是两个问题:

  1. 漏了FROM子句:SQL查询必须明确指定要从哪个表取数据,你的语句里完全没写FROM 你的表名这部分,数据库根本不知道去哪找数据。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:45:36