如何在mysql查询中按日期和时间(varchar)排序,如下面给出的代码:
我的日期/时间格式如下: 13:30:21 PM / 27-6-2016
我的查询
select * from post_home where status='1' ORDER BY edit_date_time DESC limit 0,5
答案 0 :(得分: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;
从您的示例中不清楚您的小时字段是否为零填充,因此我假设它不是(9AM将显示为9:00:00
或类似)。如果9AM显示为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;
所有这些查询都依赖于字符串保持不变的格式。如果您有时会看到带有额外空格或缺少字段的字符串,它们可能无法正常工作。