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
相关产品推荐
相关产品推荐

