PHP Carbon - 如何在没有秒的情况下按分钟比较日期时间?

PHP Carbon - How to compare a Datetime by minutes without seconds?

我有一个查询要获取在 运行 特定日期由 cronjob(每分钟)完成的预订。但是,我似乎无法查询四舍五入到最近分钟的预订。如何实现?

Booking::where('completed_at', now())->get();

这个查询只允许比较

Y-m-d H:i:s

如何比较

Y-m-d H:i

想到了两个解决方案:

Booking::whereBetween('completed_at', [now()->startOfMinute(), now()->endOfMinute() ])->get();

这会在同一分钟内获取所有内容

Booking::where(\DB::raw("DATE_FORMAT(completed_at, '%Y-%m-%d %H:%i')"), now()->format('Y-m-d H:i'))->get();

这与格式化日期匹配。

我更喜欢第一种方法,因为你不需要担心格式问题,而且它还可以利用索引。

断言 now() 将恰好每 60.00 秒发生一次是错误的,cronjob 运行 每 60 秒 +/- 几毫秒,并且 PHP 在调用 now() 之前进行处理(以及 now() 的 2 次调用之间)需要几微秒到几毫秒,具体取决于操作。

所以你应该有一个像 processed_by_the_cronjob 这样的字段,默认情况下是 false,一旦你的 CRON 作业查询它,你就将它设置为 true

那你select:

Booking::where('completed_at', '<=', now())->andWhere('processed_by_the_cronjob', false)->get();

否则,有时您的预订会被跳过。