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

Laravel查询指定日期Datetime记录如何忽略时间戳部分

问题原因

你当前的查询是对datetime类型字段做全值精确匹配:Carbon::now()->startOfDay()生成的是当日零点整(00:00:00)的时间值,最终生成的SQL是where date = 'xxxx-xx-xx 00:00:00',自然只能返回时间戳完全等于这个值的记录,无法覆盖当天其他时段的条目。

可用实现方案

方案1:使用框架自带的日期查询方法(写法最简洁)

Laravel查询构造器原生提供了whereDate方法,会自动提取datetime字段的日期部分做匹配,自动忽略时分秒部分,代码如下:

$date = Carbon::now();
// 直接传入Y-m-d格式的日期字符串即可
Task::whereDate('date', $date->toDateString())->get()->all();

这个写法代码可读性最高,不需要额外计算时间边界,适合大多数常规场景。

方案2:时间范围查询(性能最优,推荐大表/加索引场景使用)

如果你的date字段已经建立了数据库索引,推荐用范围查询的写法,这种写法可以命中索引,查询效率远高于对字段做日期函数提取的方式,严谨写法如下:

$dayStart = Carbon::now()->startOfDay();
$nextDayStart = Carbon::now()->addDay()->startOfDay();

Task::where('date', '>=', $dayStart)
    ->where('date', '<', $nextDayStart)
    ->get()->all();

注意:不推荐用whereBetween搭配startOfDay()和endOfDay()的写法,endOfDay()生成的是当日23:59:59的时间值,如果你的字段存储精度包含毫秒/微秒,会漏掉当日23:59:59之后到零点前的这部分数据,用「大于等于当日零点、小于次日零点」的范围写法可以100%覆盖所有边界情况。

方案选择建议
  • 表数据量小、没有极致性能要求:直接选方案1,开发维护成本最低
  • 表数据量大、date字段已加索引:选方案2,查询性能最好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52