如何通过更新日期和时间varchar Desc来订购

时间:2016-06-05 06:45:23

标签: mysql

如何在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

1 个答案:

答案 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;

所有这些查询都依赖于字符串保持不变的格式。如果您有时会看到带有额外空格或缺少字段的字符串,它们可能无法正常工作。