2016-06-05 2 views
-1

Как сделать заказ по дате и времени (varchar) в запросе mysql, как указано ниже:
Формат даты/времени: 13:30:21 PM/27-6-2016Как сделать заказ по обновленной дате и времени varchar Desc

Мой запрос

select * from post_home where status='1' ORDER BY edit_date_time DESC limit 0,5 
+1

«Мой формат даты/времени выглядит следующим образом: 13:30:21 PM/27-6-2016« Да. Исправьте это. Тогда вернитесь к нам. – Strawberry

ответ

0

было бы лучше практика, чтобы сохранить 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 PM11: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; 

Все эти вопросы зависят от формата вашей строки оставаясь постоянной. Если вы иногда видите строки с дополнительными пробелами или отсутствующими полями, они, вероятно, не будут работать так хорошо.

Смежные вопросы