You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Laravel Eloquent计算每行数据与当前日期的时间差?

如何用Laravel Eloquent计算当前日期与created_at的日期差并统计天数?

没问题,这需求用Eloquent其实有几种实现方式,我给你对应你原生SQL的方案,还有更贴合Laravel风格的做法:


方案1:直接对应原生SQL的写法(数据库层面计算)

如果你想完全沿用原生SQL里用unix_timestamp计算秒级时间差的逻辑,用selectRaw就能直接实现,代码简洁且和原生逻辑完全对齐:

// 筛选trial=1的用户,同时在数据库层面计算时间差
$users = User::where('trial', 1)
    ->selectRaw('unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff')
    ->get();

// 遍历获取每个用户的时间差
foreach ($users as $user) {
    $diffInSeconds = $user->time_diff;
    // 如果需要转成天数,直接除以一天的秒数(86400)即可,用floor取整得到完整天数
    $diffInDays = floor($diffInSeconds / 86400);
}

如果还需要同时获取用户的其他字段,把*加进selectRaw里就行:

$users = User::where('trial', 1)
    ->selectRaw('*, unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff')
    ->get();

方案2:用Laravel的DB::raw实现(和方案1逻辑一致)

另一种写法是用DB::raw包裹SQL片段,适合需要精准指定要查询的字段的场景:

use Illuminate\Support\Facades\DB;

$users = User::where('trial', 1)
    ->select([
        'id', 'name', // 明确指定你需要的用户字段
        DB::raw('unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff')
    ])
    ->get();

方案3:用Carbon在PHP层面计算(更灵活的Laravel风格)

Laravel默认会把模型的created_at字段转换成Carbon实例,所以你也可以在查询完数据后,用Carbon的时间差方法来计算,这种方式更灵活,适合需要对时间差做复杂处理的场景:

$users = User::where('trial', 1)->get();

foreach ($users as $user) {
    // 直接获取两个日期的天数差
    $diffInDays = now()->diffInDays($user->created_at);
    // 如果需要秒级时间差
    $diffInSeconds = now()->diffInSeconds($user->created_at);
    // 还能获取包含年、月、日的完整时间差信息
    $fullDiff = now()->diff($user->created_at);
}

小贴士:如果你的数据量比较大,优先用方案1或2,因为是在数据库层面完成计算,性能会更好;如果需要对时间差做更多个性化处理,方案3的Carbon工具会更顺手。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:06:09