
Laravel 的 whereBetween 默认包含边界值,但因 created_at 是带时间的 datetime 字段,直接传入日期字符串会导致 23:59:59 被截断,造成末尾日期数据丢失;需统一转换为当日起止时间戳或使用 whereDate 精确匹配日期部分。
laravel 的 `wherebetween` 默认包含边界值,但因 `created_at` 是带时间的 datetime 字段,直接传入日期字符串会导致 23:59:59 被截断,造成末尾日期数据丢失;需统一转换为当日起止时间戳或使用 `wheredate` 精确匹配日期部分。
在 Laravel 中对 created_at(datetime 类型)执行日期范围查询时,常见误区是直接将纯日期字符串(如 '2022-06-18' 和 '2022-06-19')传入 whereBetween:
DB::table('orders')
->whereBetween('created_at', ['2022-06-18', '2022-06-19'])
->get();
该写法实际等价于:
WHERE created_at >= '2022-06-18 00:00:00' AND created_at <p>⚠️ 注意:'2022-06-19' 会被 Laravel 自动解析为 '2022-06-19 00:00:00',因此 order2(created_at = '2022-06-19 14:30:22')<strong>不满足 ,被排除。</strong></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2156" title="Laravel 13.2.0"><img
src="https://img.php.cn/upload/manual/001/242/473/69e6e5924a679487.png" alt="Laravel 13.2.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2156" title="Laravel 13.2.0" class="overflowclass">Laravel 13.2.0</a>
<p class="overflowclass">PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2156" title="Laravel 13.2.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>✅ 正确做法有以下两种:</p><p><strong>方案一:使用 whereDate(推荐,语义清晰、无需手动计算时间)</strong><br>
仅比对日期部分,忽略时间:</p><pre class="brush:php;toolbar:false;">$from = '2022-06-18';
$to = '2022-06-19';
$orders = DB::table('orders')
->whereDate('created_at', '>=', $from)
->whereDate('created_at', 'get();方案二:手动构造完整 datetime 范围(精确控制)
确保右边界包含当日最后一秒:
$from = \Carbon\Carbon::parse('2022-06-18')->startOfDay(); // 2022-06-18 00:00:00
$to = \Carbon\Carbon::parse('2022-06-19')->endOfDay(); // 2022-06-19 23:59:59
$orders = DB::table('orders')
->whereBetween('created_at', [$from, $to])
->get();? 额外建议:
- 若使用 Eloquent 模型(如 Order::class),可进一步封装为作用域(Scope)提升复用性;
- 前端传参时建议校验日期格式(如 Y-m-d),避免无效输入;
- 对高频查询字段(如 created_at)添加数据库索引以优化性能。
总之,whereBetween 本身无问题,关键在于理解 datetime 字段与纯日期字符串的隐式转换逻辑——永远显式处理时间边界,而非依赖字符串自动截断。










