Блог вопиющего в пустыне

Даты после конвертации неправильно сортируются по возрастанию при выборке из базы MySQL

Просмотров :  255  |  Комментариев :  0

Из записок дилетанта 

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

$query="select StudentID, Surname, Name, SecondName, DocumentNumber, Testball100  from TestBallStudent WHERE Surname='$Fam' AND DocumentNumber='$Docum' ORDER BY ExamDate ASC";

В результате в веб-форму была выведена таблица, где даты тестирования располагались, как и требовалось, по возрастанию.

Сортировка по дате (год.месяц.день)

Но сами даты были представлены в не совсем удобном для восприятия виде, а именно: "год.месяц.день". Именно в таком формате даты находились в базе MySQL. Было решено конвертировать даты в "удобоваримый" формат "день.месяц.год" непосредственно в базе MySQL. Для этого был применен следующий скрипт:

UPDATE TestBallStudent 
SET ExamDate = DATE_FORMAT(STR_TO_DATE(ExamDate, '%Y.%m.%d'), '%d.%m.%Y');

И только после этого делался выше приведенный запрос $query, после выполнения которого в веб-форме была получена таблица, где даты были представлены в формате "день.месяц.год" и располагались в основном по возрастанию, кроме одной: 30.05.2022. 

Сортировка по дате (день.месяц.год)

Получалось, что оператор ORDER BY сортировал даты с возрастанием по дню, но при этом не учитывал, что дата 30.05.2022 (за май месяц) должна выводится в форму раньше, чем все остальные (июньские). Т.е. сортировка должна была проводиться сначала по месяцу, а потом по дню. Но чтобы мы ни делали, какие бы запросы не формировали, дата с большим днём, но меньшим месяцем, располагалась всегда позже, чем даты с меньшим днем, но более поздним месяцем.

Итогом всей этой деятельности стало только понимание того, что для выполнения исходного требования надо сначала в запросе $query отсортировать дату, имеющую формат "год.месяц.день", по возрастанию (в этом случае сортировка происходит правильно), и только после этого отсортированную дату переконвертировать в формат "день.месяц.год". Перелопатил весь интернет, перепробовал всё, что там предлагалось, но решения так и не было найдено: дата 30.05.2022 располагалась не там, где должна была быть.

Так бы всё и осталось в первозданном виде, если бы не случился ИИ. За недостаточностью своего (природного), воспользовался искусственным Qwen2.5-Max. Загрузил в него мой начальный запрос $query и сформулировал такую задачу: "Надо сначала отсортировать дату по возрастанию ORDER BY ExamDate ASC. И только после этого отсортированную дату переформатировать DATE_FORMAT(STR_TO_DATE(ExamDate, '%Y.%m.%d'), '%d.%m.%Y')".

И вот что он мне выдал:

Ответ ИИ

Вставил данный SQL-запрос в PHP-код веб-формы и получил отсортированную дату в формате "день.месяц.год".

Даты отсортированы по возрастанию (от ранней к поздней)

Впоследствии только немного его подкорректировал (упростил):

Упрощенный запрос




  • Комментарии
Загрузка комментариев...


Возврат к списку