Laravel 13 中 whereDate() 仍可用,用于匹配 DATETIME/TIMESTAMP 字段的日期部分;需注意时区一致,支持 'Y-m-d' 字符串或 Carbon 实例,但性能不如 whereBetween 配合 startOfDay/endOfDay。

在 Laravel 13 中,whereDate() 方法依然可用,用于精确匹配数据库字段的日期部分(忽略时间),适合查询“某一天”的全部记录。
确认字段类型和时区
whereDate() 要求数据库字段是 DATETIME 或 TIMESTAMP 类型(不能是纯 DATE)。Laravel 会自动提取日期部分做比较。同时注意应用时区(app.timezone)与数据库服务器时区是否一致,否则可能查不到预期数据。例如 PHP 设为 'Asia/Shanghai',但 MySQL 使用 UTC,就可能导致日期偏移一天。
基本用法:传入字符串或 Carbon 实例
直接传入格式为 'Y-m-d' 的字符串最常用:
$posts = Post::whereDate('created_at', '2025-04-05')->get();
也支持传入 Carbon 对象(自动格式化):
use Carbon\Carbon;
$posts = Post::whereDate('created_at', Carbon::parse('2025-04-05'))->get();
组合条件与注意事项
- 可与其他查询方法链式调用,如
->where('status', 1)->orderBy('id') - 不支持直接传入带时间的字符串(如
'2025-04-05 10:30:00'),它只取日期部分,多余时间会被忽略 - 若需查“当天零点到次日零点”,
whereDate内部已等价于:WHERE DATE(created_at) = '2025-04-05'(MySQL)或对应方言函数 - 大数据量表注意性能:该写法无法走
created_at字段的完整索引,建议配合函数索引(MySQL 8.0+)或改用whereBetween()配合时间范围提升效率
替代方案:用 whereBetween 更可控(推荐高频场景)
如果对性能或精度要求高,建议显式指定时间范围:
$start = Carbon::parse('2025-04-05')->startOfDay(); // 2025-04-05 00:00:00
$end = Carbon::parse('2025-04-05')->endOfDay(); // 2025-04-05 23:59:59
$posts = Post::whereBetween('created_at', [$start, $end])->get();
这种方式能充分利用 created_at 索引,且逻辑更明确,尤其适合定时任务或管理后台按日筛选。


















