Почему сортировка метки времени с использованием order by или latest — это сортировка только по дате, а не по времени?

#php #laravel

#php #laravel

Вопрос:

Я использую Laravel. Я добавил эту строку в контроллер

 $remarks = Remarks::where('document_id', $document->id)->orderBy('created_at', 'DESC)->get();
  

или

 $remarks = Remarks::where('document_id', $document->id)->latest('created_at')->get();
  

И я использую foreach для получения каждого замечания.
Это результаты для $remark->$description

10 ноября 2019 г. — 8:29
10 октября 2019 г. — 2:49
10 октября 2019 г. — 3:57
13 сентября 2020 г. — 2:06
13 сентября 2020 г. — 2:08

Это должно быть

13 сентября 2020 г. — 14:08
13 сентября 2020 г. — 14:06
10 ноября 2019 г. — 8:29
10 октября 2019 г. — 15:57
10 октября 2019 г. — 14:49

Кроме того, даже когда я меняю orderBy на ASC или DESC, это ни на что не влияет в представлении, оно всегда показывает это

10 ноября 2019 г. — 8:29
10 октября 2019 г. — 2:49
10 октября 2019 г. — 3:57
13 сентября 2020 г. — 2:06
13 сентября 2020 г. — 2:08

Ответ №1:

Проблема здесь в том, что, похоже, вы храните временные метки текста, и, кроме того, эти временные метки не в формате, который позволил бы сортировать по ним в каком-либо значимом хронологическом порядке. Один из обходных путей здесь вместо сортировки по этому:

 Nov. 10, 2019 - 8:29 am
  

сортируйте это как дату, используя STR_TO_DATE :

 STR_TO_DATE('Nov. 10, 2019 - 8:29 am', '%b. %d, %Y - %h:%i %p')
  

Мы можем использовать orderByRaw в Laravel для этого:

 $remarks = Remarks::where('document_id', $document->id)
    ->orderByRaw("STR_TO_DATE(created_at, '%b. %d, %Y - %h:%i %p') DESC")
    ->get();
  

В качестве некоторого общего совета вы можете рассмотреть возможность создания своего created_at столбца либо datetime , либо timestamp в MySQL. Если вы сделаете это, то сортировка по убыванию будет работать без необходимости прибегать к использованию STR_TO_DATE .