У меня есть таблица 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
Я нашел свою ошибку сам. На самом деле, я пропустил разбор секунд (% s), указанных в значении времени.
DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y %h:%i:%s %p'), '%H:%i') t
Других решений пока нет …