Laravel / PHP /Carbon анализирует дату с точностью до одного и трех дней с этого момента () с точностью до часа, не обращая внимания на минуты и секунды

#laravel #laravel-5 #eloquent #laravel-5.4 #php-carbon

#laravel #laravel-5 #красноречивый #laravel-5.4 #php-carbon

Вопрос:

Я использую Laravel 5.4 и Carbon, чтобы найти даты, которые ровно за один и три дня до задания laravel (с точностью до часа) для отправки уведомлений. Так, например, если дата была 2019-03-10 18:00:03 или 2019-03-10 18:15:34 , я бы хотел отправить уведомление завтра в 2019-03-07 18:00:00 и другое в 2019-03-09 18:00:00 . Я хотел бы сделать это в красноречивом запросе, но не совсем уверен, как выполнить «ленивое сопоставление» по дням и часам. Если у меня есть Appointment модель с start_date меткой времени, я знаю, что могу выполнить точные совпадения по дням или датам, но я хочу найти совпадения, которые не учитывают часы / секунды. Я рассматривал что-то в этом роде:

 $oneDayAppointments = Appointment::whereDay(
    'start_date',
    Carbon::now()->addDay()->day
)->get();
  

…получил бы я любые встречи, где start_date — это день с этого момента. Теперь, как бы мне отточить ее до дня и часа. Если бы я просто использовал предложение where:

 $oneDayAppointments = Appointment::where(
    'start_date',
    Carbon::now()->addHours(24)
)->get();
  

…Я мог бы получить точные совпадения, но только если бы минуты / секунды также совпадали. Спасибо!

Комментарии:

1. Вам нужно будет поиграть с объектом date перед выполнением запроса, чтобы получить текущую дату и время, но удалите минуты и секунды и добавьте к ним один день. Как только у вас будет эта дата, вам нужно будет создать дату-время «до», которая соответствует этой дате с точностью до часа 1 час — 1 секунда. Как только у вас есть эти два datetimes, вы используете whereBetween в запросе eloquent

Ответ №1:

Работая над моим комментарием выше, это должно сделать это

 $tomorrowStart = Carbon::createFromFormat('Y-m-d H:i:s', Carbon::now()->addDay()->format('Y-m-d H:00:00'));
$tomorrowEnd = $tomorrowStart->copy()->addHour()->subSecond();


//whereBetween('start_date', [$tomorrowStart, $tomorrowEnd])
  

https://laravel.com/docs/5.8/queries

Комментарии:

1. Вы понимаете, что это делает? Кроме того, будьте осторожны, если вы используете часовые пояса в своей временной метке.

2. Да, я тоже это учел. Спасибо!

3. кроме того, добавьте индекс в ваше поле start_date — в противном случае это приведет к последовательному сканированию и будет замедляться по мере заполнения большего количества записей. Либо создайте новую миграцию, либо, если вы можете выполнить откат и начать заново, добавьте в свой исходный файл миграции для модели: $table-> timestamp(‘start_date’)->index();