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();
否则,有时您的预订会被跳过。
我有一个查询要获取在 运行 特定日期由 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();
否则,有时您的预订会被跳过。