Laravel月度数据统计异常:2月1日本月记录数显示180而非0
问题原因与解决方案
你的代码逻辑存在偏差:now()->subDays(30)是统计过去30天的数据,而非当月数据。2月1日时,过去30天包含1月的全部记录,所以会统计到180条1月的IncidentReport,和预期的当月数据不符。
正确的统计写法
方法1:精准匹配当前年份与月份
Card::make('Incidents this month', IncidentReport::whereMonth('created_at', now()->month) ->whereYear('created_at', now()->year) ->count()),
该写法会筛选出当前年、月的created_at记录,2月1日时只会统计2月的新增数据,结果为0。
方法2:从当月第一天零点开始统计
Card::make('Incidents this month', IncidentReport::where('created_at', '>=', now()->startOfMonth()) ->count()),
now()->startOfMonth()会返回当前月份第一天的00:00:00,查询条件仅包含当月及之后的记录(即纯当月数据),完全符合你的需求。
额外排查建议
如果仍有异常,可打印查询语句确认条件是否正确:
$query = IncidentReport::where('created_at', '>=', now()->startOfMonth()); dd($query->toSql(), $query->getBindings());
同时确认项目时区配置是否正确,避免时区偏差导致统计范围错误,必要时可明确指定时区:
now('Asia/Shanghai')->startOfMonth()
内容的提问来源于stack exchange,提问作者Abdulrahman Mushref
相关产品推荐
相关产品推荐

