Mysql 如何按更新的日期和时间订购varchar Desc

Mysql 如何按更新的日期和时间订购varchar Desc,mysql,Mysql,如何在mysql查询中按日期和时间(varchar)排序,如下代码所示: 我的日期/时间格式如下:2016年6月27日下午13:30:21 我的查询 select * from post_home where status='1' ORDER BY edit_date_time DESC limit 0,5 最好将edit\u date\u time字段存储为DATETIME类型,而不是格式化的VARCHAR。然后,您的orderby子句将按原样工作,您可以为列编制索引以加快查询速度,并且可以

如何在mysql查询中按日期和时间(varchar)排序,如下代码所示:

我的日期/时间格式如下:2016年6月27日下午13:30:21

我的查询

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

最好将
edit\u date\u time
字段存储为
DATETIME
类型,而不是格式化的
VARCHAR
。然后,您的
orderby
子句将按原样工作,您可以为列编制索引以加快查询速度,并且可以使用
DATE\u格式(编辑日期时间,'%H:%i:%s%p/%e-%c-%Y')将其转换为此处显示的格式。

如果出于任何原因,需要以您提供的文本格式存储字段,您可以使用
子字符串(u 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小时格式提供的(实际上没有13点)。如果这是一个打字错误,您需要对
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”是的。解决这个问题。那就回来找我们。