Tengo una consulta para obtener las reservas que se realizaron en una fecha específica que se ejecuta mediante un cronjob (cada minuto). Sin embargo, parece que no puedo consultar las reservas redondeadas al minuto más cercano. ¿Cómo se puede lograr esto?
Booking::where('completed_at', now())->get();
Esta consulta solo permite comparar
Ymd H:i:s
como puedo comparar
Ymd H:i
Hay dos soluciones que vienen a la mente:
Booking::whereBetween('completed_at', [now()->startOfMinute(), now()->endOfMinute() ])->get();Esto obtiene todo en el mismo minuto.
Booking::where(\DB::raw("DATE_FORMAT(completed_at, '%Y-%m-%d %H:%i')"), now()->format('Ymd H:i'))->get();Esto coincide con las fechas formateadas.
Prefiero el primer enfoque porque no necesita preocuparse por problemas de formato y también puede hacer uso de índices.
Afirmar que now() ocurrirá exactamente cada 60.00 segundos es incorrecto, el cronjob se ejecuta cada 60 segundos +/- unos pocos ms, y el proceso de PHP antes de llamar a now() (y entre 2 llamadas de now() ) toma unos pocos µs a unos pocos ms dependiendo sobre las operaciones.
Por lo tanto, debe tener un campo como processed_by_the_cronjob que es false de forma predeterminada y lo establece en true una vez que su trabajo CRON lo consultó.
Luego seleccionas:
Booking::where('completed_at', '<=', now())->andWhere('processed_by_the_cronjob', false)->get();De lo contrario, de vez en cuando tendrá una reserva que se omitirá.