2010-11-16 2 views
2

Есть ли способ захватить самое последнее время суток. Если ваши данные в базе данных отформатированы следующим образом: 07:00 и 20:00 и 12:00. Сорта вроде max(). Но на время. В запросе Mysql.MYSQL последнее время

Благодаря Эрик

+0

Какая у вас колонка? –

+0

Его поле Char – Eric

ответ

3

Было бы лучше сохранить его в другом формате, а не в виде текста. Или, по крайней мере, хранить его в 24-часовом формате, тогда будет работать простой вид. Вы можете преобразовать его в 12-часовой формат при отображении данных пользователю.

Но если вы не можете изменить схему базы данных, попробуйте следующее:

SELECT * 
FROM your_table 
ORDER BY STR_TO_DATE(your_time, '%h:%i%p') DESC 
LIMIT 1 

Обратите внимание, что это не будет иметь возможность использовать индекс для выполнения сортировки.

+2

Это также неправильно соответствует цифрам «12: .....». Вы должны иметь четыре поля сортировки, left = 12am, затем right (your_time), затем left = 12pm, затем your_time. –

+0

@Ben Lee: О да, я совсем забыл, что 12:00 должен сортировать * до * 01:00. Эффективно «12:» следует сортировать так, как если бы было «00:». Таким образом, еще один способ решить это может быть упорядочен по полю после замены '12: 'на '00:'. –

+0

Даже с изменением, которое вы сделали, это все равно будет помещено где-нибудь между «12:00 pm» (полдень) и «12:59 pm» в самой верхней части списка, а не в середине. Вы должны поместить функцию REPLACE в оба параметра порядка: «RIGHT (REPLACE (your_time, '12: ', '00:'), 2) DESC, REPLACE (your_time, '12: ', '00:') DESC' –

-1

Вы можете просто сортировать.

select time_column from table order by time_column desc limit 1; 
+1

нет, он не может. это поле строки, и у него есть части AM и PM. –

0

Предполагая, что вы имеете дело с полем DATETIME в вашем MySQL, вы можете использовать этот запрос, чтобы получить максимальное время в день:

SELECT DATE(YourDateField), MAX(TIME(YourDateField)) FROM YourTable 
GROUP BY DATE(YourDateField) 

Когда вы имеете дело с полем VARCHAR, вы можете попробовать взломать вот так:

SELECT YourDateField, SUBSTRING(MAX(
    CASE WHEN YourTimeField LIKE '%AM%' THEN '0' ELSE '1' END 
    + REPLACE(YourTimeField, '12:', '00:') 
), 2) 
GROUP BY YourDateField 
+0

он сказал, что не имеет дело с полем datetime, но с полем строки, которое имеет am/pm. –

+0

Нет, он сказал, что его поле было * отформатировано * с AM/PM. Он не упоминал о типе своего поля. – thomaspaulb

1

Вместо этого вы должны попробовать STR_TO_DATE(), если используете строку. Если ваше время всегда в формате чч: mmAMPM, вы можете использовать:

MAX(STR_TO_DATE(YourTimeField,'%h:%i%p')) 

Это преобразует строку в то время, без необходимости разделить его на подстроки или что-нибудь, так что MySQL будет тогда видеть 09:07 как 09:07:00 и 14:35 вечера в 14:35:00, а затем легко сможет определить MAX этого.

+0

И я набрал этот ответ слишком медленно: -P – spanky

+0

+1 в любом случае, заметив, что теперь, когда выбрано только одно поле, MAX будет работать. Я не обновлял свой ответ, чтобы использовать MAX после его изменения, чтобы использовать STR_TO_DATE. –

0

Если это вообще возможно, лучше всего конвертировать поле в datetime. Тогда:

  • Вы можете использовать MAX(), чтобы получить самую позднюю дату
  • Вы будете иметь доступ к другим функций даты и времени, если вам нужно их позже
  • MySQL обеспечит некоторую базовую проверку типов и подтверждение ввода
+0

Как автоматически заполнить поле datetime в php? – Eric

+0

Если у вас есть временная метка, вы можете использовать функцию даты() PHP или функцию MySQL FROM_UNIXTIME для преобразования в формат даты и времени MySQL. В противном случае просто заполните его, используя формат YYYY-MM-DD hh: mm: ss, используя 24-часовое время. –

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