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

如何从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,就能避免性能问题:

  1. 如果date是date类型(不带时分秒):
SELECT * 
FROM price_log 
WHERE date = '2022-08-31' -- 若要动态取当前日期,用CURDATE()即可
  1. 如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:27:30