Я пытаюсь выбрать все записи по дате/времени. У меня есть временные метки в 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
Пожалуйста, попробуйте что-то вроде этого:
$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();
Вы должны сделать следующие шаги:
DATE_FORMAT(orders.created_at, "%b %d") day
)Все возможные форматы описаны здесь: введите здесь описание ссылки
Спасибо за ваше потраченное время, чтобы написать это. Я попробовал ваш метод, но он не работает (у меня более сложный код, и я не могу его интегрировать), и это немного длинный путь по сравнению с другим ответом.
Без проблем. Отлично, если вы уже решили свою проблему
Вы можете использовать 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();
Спасибо, первый способ очень шустрый :) Но с фиксом все равно не получится. В любом случае проблема решена! :)
:) да, просто ярлык, чтобы сохранить всю обработку и сложности с форматами времени, но если второй запрос работает, попробуйте выяснить, что быстрее (лайк или извлечение), второй запрос может работать, если вы используете Group By
так что не так с вашим кодом? любые ошибки?