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

Laravel日期时间比较问题:如何筛选晚于当前时间的API数据?

解决Laravel中筛选晚于当前时间的Datetime记录问题

嘿,我明白你的问题了——你想筛选出date_time字段晚于当前柏林时间的记录,但之前分开用whereDate和whereTime的写法逻辑有问题,导致时间筛选不符合预期。

问题出在哪?

你原来的代码:

$viewingAppointments = ViewingAppointment::whereDate('date_time', '>=', Carbon::now('Europe/Berlin'))
    ->whereTime('date_time', '>=', Carbon::now('Europe/Berlin'))
    ->withCount('requests')
    ->get();

这段代码的逻辑是日期大于等于今天,并且时间大于等于当前时间,这会错误排除掉那些日期在明天及以后,但时间早于当前时间的记录(比如当前是今天10点,明天9点的记录会被whereTime过滤掉,但实际上明天9点是晚于当前时间的),完全不符合你“只要整体时间晚于当前就输出”的需求。

正确的写法

你不需要分开日期和时间筛选,直接对整个date_time字段和当前时间做比较就可以了,Laravel支持直接用Carbon实例作为查询参数:

// 先获取当前柏林时间,避免多次调用重复生成时间
$currentBerlinTime = Carbon::now('Europe/Berlin');

$viewingAppointments = ViewingAppointment::where('date_time', '>=', $currentBerlinTime)
    ->withCount('requests')
    ->get();

这样数据库会直接把date_time字段的完整datetime值和$currentBerlinTime做比较,只要date_time整体晚于当前时间的记录都会被筛选出来,完美贴合你的需求。

额外说明

  • 确保你的date_time字段在数据库中是datetime或timestamp类型,这样数据库才能正确进行datetime比较。
  • 如果你想用Carbon的比较器语法,也可以简化成下面的写法(效果和上面完全一致):
$viewingAppointments = ViewingAppointment::where('date_time', '>=', Carbon::now('Europe/Berlin'))
    ->withCount('requests')
    ->get();

Laravel会自动把Carbon实例转化为数据库能识别的datetime格式,不需要额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:12:54