You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何日期范围查询未包含选中的结束日期?结果少一天求助

问题分析与解决

问题根源

你的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

火山引擎 最新活动