Интервал в один час - Laravel

Я пытаюсь выбрать все записи по дате/времени. У меня есть временные метки в postgreSQL:

13/12/2020 11:00:00
14/12/2020 11:31:00
14/12/2020 12:30:00
14/12/2020 13:00:00
15/12/2020 02:00:00

У меня есть код в контроллере, получающий все записи:

    $start_date = date('d/m/Y 00:00:00');
    $end_date = date('d/m/Y 23:59:59');

    if ($request->start_date != '' && $request->end_date != '')
    {
        // if user fill dates
        $dateScope = array($request->start_date, $request->end_date);
    } else {
        // default load page - today
        $dateScope = array($start_date, $end_date);
    };

  $results  = Tablemodel1::whereBetween('table1.recordtime', $dateScope)
    ->selectRaw('table1.recordtime','table2.info')
    ->orderBy('recordtime', 'ASC')
    ->get();

Цель состоит в том, чтобы выбирать только записи каждый час следующим образом:

13/12/2020 11:00:00
14/12/2020 13:00:00
15/12/2020 02:00:00

Я получаю сообщение об ошибке при использовании:

  $results  = Tablemodel1::whereBetween('table1.recordtime', $dateScope)
    ->selectRaw('extract(hour from table1.recordtime)','table2.info')
    ->orderBy('recordtime', 'ASC')
    ->get();

Ошибка:

Undefined index: recordtime

так что не так с вашим кодом? любые ошибки?

ml59 14.12.2020 11:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
4
1
422
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, попробуйте что-то вроде этого:

$result = Tablemodel1::select([
                 DB::raw('count(table2.info) as counted_info'),
                 DB::raw('DATE_FORMAT(table1.recordtime, "%H") hour'),
          ])
          ->whereBetween('table1.recordtime', $dateScope)
          ->groupBy('hour')
          ->orderBy('hour')
          ->get();

Вы должны сделать следующие шаги:

  1. Дата формата
  2. Сгруппировать по форматированной дате (пример: DATE_FORMAT(orders.created_at, "%b %d") day)
  3. Сортировать (необязательно)
  4. собирать данные

Все возможные форматы описаны здесь: введите здесь описание ссылки

Спасибо за ваше потраченное время, чтобы написать это. Я попробовал ваш метод, но он не работает (у меня более сложный код, и я не могу его интегрировать), и это немного длинный путь по сравнению с другим ответом.

Hristian Yordanov 14.12.2020 12:44

Без проблем. Отлично, если вы уже решили свою проблему

Vasyl Zhuryk 14.12.2020 12:58
Ответ принят как подходящий

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

$results  = Tablemodel1::whereBetween('table1.recordtime', $dateScope)
    ->where('table1.recordtime','LIKE', '%:00:00%')
    ->selectRaw('table1.recordtime','table2.info')
    ->orderBy('recordtime', 'ASC')
    ->get();

Кроме того, ваш запрос, вероятно, может работать с этим небольшим исправлением (AS column_name)

$results  = Tablemodel1::whereBetween('table1.recordtime', $dateScope)
    ->selectRaw('extract(hour from table1.recordtime) AS recordtime','table2.info')
    ->orderBy('recordtime', 'ASC')
    ->get();

Спасибо, первый способ очень шустрый :) Но с фиксом все равно не получится. В любом случае проблема решена! :)

Hristian Yordanov 14.12.2020 12:41

:) да, просто ярлык, чтобы сохранить всю обработку и сложности с форматами времени, но если второй запрос работает, попробуйте выяснить, что быстрее (лайк или извлечение), второй запрос может работать, если вы используете Group By

Mehravish Temkar 14.12.2020 12:42

Другие вопросы по теме