为何日期范围查询未包含选中的结束日期?结果少一天求助
问题分析与解决
问题根源
你的SQL中lo.end_time <= '2025-04-27'这个条件存在逻辑漏洞:如果lo.end_time是带时分秒的datetime/timestamp类型,数据库会自动将纯日期字符串解析为2025-04-27 00:00:00。这会导致所有end_time在2025-04-27当天0点之后的记录(比如2025-04-27 10:30:00)被过滤掉,自然查不到该日期的完整数据。
修正方案
推荐两种可行的修改方式,优先选第一种以保证性能:
方案1:扩展结束时间范围(推荐)
将结束条件改为小于下一天的0点,这样能完整覆盖2025-04-27全天的所有记录,同时可以利用end_time字段上的索引,查询效率更高:
SELECT l.id AS aslocation_id , l.name , lo.id , lo.start_time , lo.end_time , lo.leader_id , lo.is_storno , lo.storno_at , lo.storno_by , lo.employees_need , lo.created_at FROM location_orders AS lo JOIN location AS l ON l.id = lo.location_id WHERE lo.tenant_id = 321 AND lo.deleted_by IS NULL AND lo.start_time >= '2025-01-02' AND lo.end_time < '2025-04-28' -- 修改为小于下一天的0点 ORDER BY lo.start_time DESC , lo.id DESC LIMIT 50;
方案2:提取日期部分比较(不推荐大表使用)
如果数据库支持日期函数,可以提取end_time的日期部分进行比较,但这种方式会对每条记录做函数计算,无法利用索引,数据量大时性能会明显下降:
SELECT l.id AS aslocation_id , l.name , lo.id , lo.start_time , lo.end_time , lo.leader_id , lo.is_storno , lo.storno_at , lo.storno_by , lo.employees_need , lo.created_at FROM location_orders AS lo JOIN location AS l ON l.id = lo.location_id WHERE lo.tenant_id = 321 AND lo.deleted_by IS NULL AND lo.start_time >= '2025-01-02' AND DATE(lo.end_time) <= '2025-04-27' -- 提取日期部分做比较 ORDER BY lo.start_time DESC , lo.id DESC LIMIT 50;
内容的提问来源于stack exchange,提问作者oemer ok




