如何从SQL查询提取指定日期价格?两种实现方案的疑问
如何同时获取全量价格数据与指定日期的价格?
需求说明:需要查询全量price_log数据用于生成图表,同时单独提取指定日期(2022-08-31)的价格展示。现有表结构如下:
date | price ------------+------------ 2022-08-31 | 10.0 2022-08-30 | 32.0 2022-08-29 | 20.0 2022-08-28 | 12.0
当前执行的全量数据查询SQL:
SELECT * FROM `price_log` WHERE 1
针对你的两个方案疑问,解答如下:
方案一:从全量查询结果中提取指定日期价格
应用层处理
拿到全量查询结果后,直接筛选date等于2022-08-31的记录即可。举个Python示例:
# 假设全量数据存储在data列表中,每个元素是包含date和price的字典 target_price = None for item in data: if item['date'] == '2022-08-31': target_price = item['price'] break
SQL层标记
如果想在SQL里直接标记出目标日期的记录,可以用CASE语句:
SELECT date, price, -- 标记是否为目标日期,1是,0否 CASE WHEN date = '2022-08-31' THEN 1 ELSE 0 END AS is_target_date FROM `price_log`
拿到结果后,只要筛选is_target_date = 1的记录,就能快速得到目标价格。
方案二:二次查询的性能顾虑分析
你写的二次查询SQL确实存在性能隐患:
SELECT * FROM price_log WHERE DATE(date) = CURDATE()
问题出在DATE(date)函数上——如果date字段是datetime类型,用函数包裹字段会导致数据库无法使用该字段上的索引,只能做全表扫描。数据量小时可能没感觉,数据量大了会明显变慢。
优化后的二次查询
根据date字段的类型调整SQL,就能避免性能问题:
- 如果
date是date类型(不带时分秒):
SELECT * FROM price_log WHERE date = '2022-08-31' -- 若要动态取当前日期,用CURDATE()即可
- 如果
date是datetime类型:
SELECT * FROM price_log WHERE date >= '2022-08-31' AND date < '2022-09-01'
只要date字段上建了索引,优化后的查询会直接走索引,性能拉满,完全不用担心性能问题。
替代方案:一次查询同时拿全量和目标价格
如果不想做两次查询,也可以用子查询在一次SQL里搞定:
SELECT *, -- 子查询直接取出目标日期的价格 (SELECT price FROM price_log WHERE date = '2022-08-31') AS target_price FROM `price_log`
返回的结果里,每一行都会附带target_price字段,应用层取一次就能拿到目标价格,不用额外查询。
内容的提问来源于stack exchange,提问作者Alpha.Ars
相关产品推荐
相关产品推荐

