MySQL中如何基于分离的日期和时间列查询时间区间数据
解决分离日期和时间列的区间查询问题
你的原SQL语句在语法和逻辑上都存在问题,核心是BETWEEN用法错误,且条件拼接混乱。下面给你两种可行的解决方案:
方法一:拼接日期和时间为完整datetime后比较
把日期列data和时间列Var3拼接成完整的日期时间值,再用BETWEEN筛选区间。不同数据库的拼接语法略有差异,以下是常见数据库的写法:
MySQL/MariaDB
SELECT * FROM prices.prices WHERE CONCAT(data, ' ', Var3) BETWEEN '2020-01-06 12:41' AND '2020-01-10 14:59';
PostgreSQL
SELECT * FROM prices.prices WHERE (data || ' ' || Var3)::timestamp BETWEEN '2020-01-06 12:41' AND '2020-01-10 14:59';
SQL Server
SELECT * FROM prices.prices WHERE CAST(data AS VARCHAR) + ' ' + Var3 BETWEEN '2020-01-06 12:41' AND '2020-01-10 14:59';
这种写法简洁直观,但要注意:如果data和Var3单独建有索引,拼接后的表达式无法利用索引,数据量大时性能会受影响。
方法二:拆分日期和时间条件(推荐,性能更优)
通过逻辑分支分别处理起始日、结束日和中间日期的条件,这样可以利用data和Var3的索引:
SELECT * FROM prices.prices WHERE -- 起始日期:时间需大于等于12:41 (data = '2020-01-06' AND Var3 >= '12:41') -- 中间日期:所有时间都符合 OR (data BETWEEN '2020-01-07' AND '2020-01-09') -- 结束日期:时间需小于等于14:59 OR (data = '2020-01-10' AND Var3 <= '14:59');
原语句的错误说明
- BETWEEN语法错误:BETWEEN要求前后是同类型的单个值,你把日期和时间的比较结果(布尔值)作为BETWEEN的参数,完全不符合语法规则。
- 条件逻辑混乱:原语句用AND连接了多个不相关的条件,导致数据库无法理解你的筛选意图。
内容的提问来源于stack exchange,提问作者KRS Cristian
相关产品推荐
相关产品推荐

