Сортировка MySQL по дате и времени по строке datetime

У меня есть таблица MySQL со следующей схемой:

CREATE TABLE `events` (
`id` bigint(20) NOT NULL,
`name` text NOT NULL,
`time` text NOT NULL,
`city` text NOT NULL,
`description` text NOT NULL,
`contact_name` text NOT NULL,
`contact_number` text NOT NULL,
`contact_email` text NOT NULL,
`image` text NOT NULL,
`main_event` int(11) NOT NULL DEFAULT '0',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Теперь мы можем видеть, что столбец времени является типом текста. Пример записи по времени приведен ниже:

12/09/2017 05:45:00 pm
12/09/2017 02:00:00 pm
13/09/2017 10:30:00 am

Теперь я хочу получить записи, разделенные по дням, т.е. записи за 12/09/2017 и 13/09/2017, а также они должны быть отсортированы по времени в порядке возрастания.
Так что мой пример вывода будет как ниже

12/09/2017 02:00:00 pm
12/09/2017 05:45:00 pm

затем

13/09/2017 10:30:00 pm

Я попытался получить идентификатор, используя групповой конкат, и попытался преобразовать эту строку даты текстового типа, используя комбинацию DATE_FORMAT и STR_TO_DATE.
Но проблема в том, что я не могу правильно его отсортировать. Если я использую аргумент% p с STR_TO_DATE, вывод становится NULL.

Я в настоящее время использую следующий запрос

SELECT GROUP_CONCAT(id) id, DAY(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) day, MONTHNAME(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) month, DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d') test FROM events WHERE main_event >= 0 GROUP BY DAY(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')), MONTH(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) ORDER BY test ASC

И вывод:

id          day   month      test
13,10,14    11    September  2017-09-11
15,16,19    12    September  2017-09-12

Но я хочу, чтобы идентификатор также сортировался по часам, то есть сначала в 9:00:00, а затем в 10:00:00.

Также, подумав, я попытался отсортировать их после получения результата, как показано ниже:

SELECT DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y %h:%i %p'), '%d/%m/%Y %h:%i %p') t FROM events WHERE id = 15 or id = 16 or id = 19 ORDER BY t ASC

Но результат NULL

0

Решение

Я нашел свою ошибку сам. На самом деле, я пропустил разбор секунд (% s), указанных в значении времени.

DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y %h:%i:%s %p'), '%H:%i') t
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]