在 Laravel 12 中查“今日”和“昨日”数据应使用 whereDate() 配合 today()、yesterday() 或 subDay();查合并统计需用 selectRaw('DATE(created_at) as date') + whereDate 范围 + groupBy;务必注意时区配置,推荐统一设为业务时区如 'Asia/Shanghai'。

在 Laravel 12 中查询“今日”和“昨日”的每日数据,核心是用 whereDate() 方法配合 Carbon(Laravel 默认集成)处理日期。不需要手写 SQL 或复杂时间戳转换。
查今日数据
使用 whereDate() 直接比对数据库字段的日期部分与今天:
$todayData = Order::whereDate('created_at', today())->get();
说明:
- today() 是 Laravel 提供的全局辅助函数,等价于 Carbon::today();whereDate() 会自动提取数据库字段的日期部分(如 MySQL 的 DATE(created_at))进行匹配。
- 确保 created_at 是 datetime/timestamp 类型,且时区配置正确(推荐设为应用所在时区,如 'timezone' => 'Asia/Shanghai')。
查昨日数据
同样用 whereDate(),但传入昨天的日期:
$yesterdayData = Order::whereDate('created_at', today()->subDay())->get();
也可写成:
$yesterdayData = Order::whereDate('created_at', yesterday())->get();
说明:
- yesterday() 也是 Laravel 内置辅助函数;subDay() 更灵活,比如要查前两天就用 subDays(2)。
- 若数据库用 UTC 时间而你想按本地日统计,需先将时间转为本地再取日期,例如:whereDate('created_at', Carbon::yesterday('Asia/Shanghai'))
查今日 + 昨日合并统计(分组)
如果想一次性查两天的数据并按天分组(如统计每日订单数):
$dailyStats = Order::selectRaw('DATE(created_at) as date, COUNT(*) as count')
->whereDate('created_at', '>=', today()->subDay())
->groupBy('date')
->orderBy('date')
->get();
结果示例:
- {"date":"2024-05-20","count":12} ← 昨日
- {"date":"2024-05-21","count":8} ← 今日
注意:
- whereDate(..., '>=', ...) 是范围写法,兼容 MySQL 5.7+ 和 PostgreSQL;
- selectRaw('DATE(created_at) as date') 确保跨数据库兼容性(SQLite 也支持 DATE())。
小技巧:避免时区陷阱
如果服务器时区和业务时区不一致(比如服务器用 UTC,你要按北京时间统计),别依赖系统默认时间:
- 在查询中显式指定时区:
today('Asia/Shanghai') - 或统一在
config/app.php设置'timezone' => 'Asia/Shanghai',之后所有 Carbon 操作默认按该时区解析 - 数据库连接里开启
'timezone' => '+08:00'(MySQL)可让时间字段存入/读取自动偏移,减少 PHP 层转换


















