было бы лучше практика, чтобы сохранить edit_date_time
поле как DATETIME
типа вместо форматированного VARCHAR
. Тогда ваш оператор ORDER BY
будет работать так, как есть, вы можете индексировать столбец, чтобы ускорить запрос, и вы можете преобразовать его в формат, который у вас есть для отображения, с помощью DATE_FORMAT(edit_date_time, '%H:%i:%s %p/%e-%c-%Y')
.
Если по какому-либо причине, вы потребность хранить поля в текстовом формате, предоставленных Вами, Вы можете сортировать по ней с помощью SUBSTRING_INDEX
вытаскивать разделы даты в порядке значимости. Вам нужно будет CAST
некоторые из значений как UNSIGNED INTEGER
, потому что поле вашего месяца не имеет завершающих нулей, и поэтому «12» придет до «2», если отсортировано в алфавитном порядке.
SELECT * FROM post_home
WHERE status='1'
ORDER BY SUBSTRING_INDEX(edit_date_time, '-', -1) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, '-', -2) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ' ', -1) AS UNSIGNED) DESC,
CAST(edit_date_time AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ':', -2) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ':', -1) AS UNSIGNED) DESC
LIMIT 0, 5;
Это не ясно из вашего примера, является ли нулями ваш час поле, поэтому я предположил, что это не является (9 утра будет выглядеть как 9:00:00
или аналогичный). Если 9 утра будет выглядеть как 09:00:00
вы можете упростить
SELECT * FROM post_home
WHERE status='1'
ORDER BY SUBSTRING_INDEX(edit_date_time, '-', -1) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, '-', -2) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ' ', -1) AS UNSIGNED) DESC,
edit_date_time DESC
LIMIT 0, 5;
В вашем примере, поле AM/PM является излишним, поскольку время обеспечивается в 24-часовом формате в любом случае (есть на самом деле не 13pm). Если это опечатка, и вам нужно сортировать 12:00:00 PM
< < 01:00:00 PM
11:00:00 AM
вы можете использовать
SELECT * FROM post_home
WHERE status='1'
ORDER BY SUBSTRING_INDEX(edit_date_time, '-', -1) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, '-', -2) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ' ', -1) AS UNSIGNED) DESC,
SUBSTRING_INDEX(edit_date_time, ' ', -3) DESC,
CAST(edit_date_time AS UNSIGNED) != 12 DESC,
CAST(edit_date_time AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ':', -2) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(edit_date_time, ':', -1) AS UNSIGNED) DESC
LIMIT 0, 5;
Все эти вопросы зависят от формата вашей строки оставаясь постоянной. Если вы иногда видите строки с дополнительными пробелами или отсутствующими полями, они, вероятно, не будут работать так хорошо.
«Мой формат даты/времени выглядит следующим образом: 13:30:21 PM/27-6-2016« Да. Исправьте это. Тогда вернитесь к нам. – Strawberry