在 Laravel 9 中,查询每日数据应据字段类型选择方法:DATETIME/TIMESTAMP 用 whereDate() 或 whereBetween()(推荐后者保索引),DATE 类型可直接 = 查询;分组统计用 selectRaw('DATE()')。

在 Laravel 9 中,区分「日期字段」(如 DATE 类型)和「时间字段」(如 DATETIME 或 TIMESTAMP)进行每日数据查询,关键不在于字段类型本身,而在于你**如何提取和比较日期部分**。数据库中存的是完整时间戳,但用户要的是“某一天的所有记录”,这就需要统一按「日粒度」提取和匹配。
用 whereDate() 精确匹配日期部分(推荐)
当字段是 DATETIME 或 TIMESTAMP(比如 created_at),而你想查「2026-10-21 当天」的所有记录,直接用 whereDate() 最简洁可靠:
- 它会自动调用数据库的
DATE()函数(MySQL)或等效函数(PostgreSQL/SQLite),只比对年月日 - 不依赖 PHP 层解析,避免时区或格式歧义
- 语法清晰,语义明确
示例:
$todayData = Order::whereDate('created_at', '2026-10-21')->get();
等价于 SQL:SELECT * FROM orders WHERE DATE(created_at) = '2026-10-21';
用 whereBetween() 避免索引失效(高性能场景)
whereDate() 虽方便,但在大数据量、高并发下可能让数据库无法使用 created_at 字段上的索引(因对字段加了函数)。此时应改用范围查询:
- 计算当天起止时间点:从
00:00:00到23:59:59(或更推荐:次日00:00:00前) - 用
whereBetween()或两个where()构建闭区间 - 确保
created_at字段有 B-tree 索引(Laravel 迁移中默认已建)
示例:
复制代码$start = Carbon::parse('2026-10-21')->startOfDay();<br>
$end = Carbon::parse('2026-10-21')->endOfDay();<br>
$todayData = Order::whereBetween('created_at', [$start, $end])->get();
日期字段(DATE 类型)可直接用 = 查询
如果你的字段本身就是 DATE 类型(例如 order_date),没有时分秒,那就不需要特殊处理:
- 直接用字符串或 Carbon 实例比较即可,数据库原生支持
- 性能最优,天然走索引
- 注意:传入值必须是
Y-m-d格式,否则可能隐式转换失败
示例:
复制代码$todayData = Order::where('order_date', '2026-10-21')->get();<br>
// 或<br>
$todayData = Order::where('order_date', today())->get(); // today() 返回 Carbon 实例,自动转为 Y-m-d
按日期分组统计每日数据量
若目标不是查记录,而是统计「每天多少条」,配合 groupBy() 和聚合函数:
- 仍建议对
DATETIME字段用DATE()分组(Eloquent 不直接支持,需用selectRaw) - 避免在 GROUP BY 中对字段加函数,除非确认索引策略已优化
示例:
复制代码$dailyCounts = Order::selectRaw('DATE(created_at) as date, COUNT(*) as count')<br>
->whereDate('created_at', '>=', '2026-10-01')<br>
->groupBy('date')<br>
->orderBy('date')<br>
->get();


















