SQL如何查询爬取日期非今日及从未被爬取的公司数据?
问题根源
你原有SQL仅能匹配到已存在爬取记录且上次爬取日期非今日的公司,没有覆盖「从未有过爬取记录」的逻辑,因此无法返回MCSFT对应的记录。
修正方案
方案1:LEFT JOIN 写法(兼容性最强,适配所有主流数据库)
通过左连接关联两张表,直接判断两种符合重爬要求的场景即可:
SELECT c.* FROM companies c LEFT JOIN Crawl_Settings cs ON c.Symbol = cs.Symbol AND c.Exchange = cs.Exchange WHERE -- 场景1:无任何爬取记录 cs.Symbol IS NULL -- 场景2:有爬取记录但上次爬取不是今日 OR DATE(cs.`Last crawl date`) != CURDATE();
注意:日期函数可根据你使用的数据库调整:MySQL用
CURDATE(),SQL Server用CAST(GETDATE() AS DATE),Oracle用TRUNC(SYSDATE)。如果你的Last crawl date字段仅存储日期不含时分秒,可以去掉外层的DATE()转换。
方案2:IN 组合写法(逻辑更直观)
SELECT * FROM companies WHERE -- 场景1:从未有过爬取记录 (Symbol, Exchange) NOT IN (SELECT Symbol, Exchange FROM Crawl_Settings) -- 场景2:有爬取记录但上次爬取非今日 OR (Symbol, Exchange) IN ( SELECT Symbol, Exchange FROM Crawl_Settings WHERE DATE(`Last crawl date`) != CURDATE() );
注意事项
- 必须同时匹配
Symbol和Exchange两个联合主键字段,避免出现不同交易所同代码公司的匹配错误 - 日期比较前尽量统一格式,避免因字段带时分秒导致判断偏差
内容的提问来源于stack exchange,提问作者Bouji
相关产品推荐
相关产品推荐

