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

Laravel Eloquent使用whereDate查询无法匹配跨期预订记录怎么办

问题原因

现有查询逻辑只能匹配完全落在你指定的$startDate和$endDate范围内的预订,自然会漏掉两类符合要求的记录:

  • 预订开始时间早于2021-08-25,但结束时间在2021-08-25之后
  • 预订结束时间晚于2021-09-01,但开始时间在2021-09-01之前
    你提到的完整覆盖目标时间段的预订就属于这类漏匹配的情况。

调整方案

根据你的实际查询需求选择对应逻辑即可:

场景1:查询所有和8月25日-8月31日有重叠的预订(哪怕只占用其中1天)

判断时间段重叠的通用逻辑为:预订开始时间 <= 目标区间结束时间 且 预订结束时间 >= 目标区间开始时间,代码如下:

// 注意保持字段名一致,你文档中提到的结束字段为booking_end,示例代码中用的是reservation_end
$targetStart = '2021-08-25';
$targetEnd = '2021-08-31';

Booking::select('id', 'name', 'reservation_begin', 'reservation_end')
    ->whereDate('reservation_begin', '<=', $targetEnd)
    ->whereDate('reservation_end', '>=', $targetStart)
    ->get();

如果你的时间字段包含时分秒,建议替换whereDate避免精度丢失:

Booking::select('id', 'name', 'reservation_begin', 'reservation_end')
    ->where('reservation_begin', '<=', $targetEnd . ' 23:59:59')
    ->where('reservation_end', '>=', $targetStart . ' 00:00:00')
    ->get();

场景2:查询完全覆盖8月25日-8月31日整个时间段的预订

如果只需要匹配你举例的这类完整覆盖目标区间的预订,逻辑调整为:预订开始时间 <= 目标区间开始时间 且 预订结束时间 >= 目标区间结束时间,代码如下:

$targetStart = '2021-08-25';
$targetEnd = '2021-08-31';

Booking::select('id', 'name', 'reservation_begin', 'reservation_end')
    ->whereDate('reservation_begin', '<=', $targetStart)
    ->whereDate('reservation_end', '>=', $targetEnd)
    ->get();

内容的提问来源于stack exchange,提问作者Sandro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:15:00