我有一个mysql表,月和年在相同的字段如下。
+----------------+
| duedate |
+----------------+
| Sept '12 |
| Oct '12 |
| Nov '12 |
| May'13 |
| Mar'13 |
| Mar '13 |
| Jan '13 |
| Feb '13 |
| Dec '12 |
| Aug '12 |
| Apr '13 |
+----------------+
我想通过按DESC顺序排序月份和年份值来检索这个表,如下所示。
+------------+
| duedate |
+------------+
| May'13 |
| Apr '13 |
| Mar '13 |
| Mar'13 |
| Feb '13 |
| Jan '13 |
| Dec '12 |
| Nov '12 |
| Oct '12 |
| Sept '12 |
| Aug '12 |
+------------+
是否可能按上述方式排序?我已经尝试了下面的sql查询,但它仅按年值的DESC对数据进行排序,月份排序不起作用。
"SELECT DISTINCT duedate FROM sample_table ORDER BY substr(duedate, -2) DESC, FIELD(duedate, 'Dec', 'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'May', 'Apr', 'Mar', 'Feb', 'Jan')"
请帮. .
您应该将日期存储在DATE
类型中,而不是在VARCHAR
或CHAR
中,因为您似乎正在这样做。
在这种情况下,您可以非常简单地按照您想要的顺序检索数据,只需以这种方式使用ORDER BY
:
select * from YOURTABLE order by date asc
如果因为任何原因你不能改变这一点,我建议你在你的表中添加另一列(例如称为read_date
),然后只是更新你的表,如:
update table YOURTABLE set real_date = date
将正确的值添加到列中,您将能够正确地处理日期。
如果您仍然不想这样做,您可以使用STR_TO_DATE函数强制将数据转换为日期,如下所示:
SELECT * FROM YOURTABLE ORDER BY STR_TO_DATE(date, '%b %y') DESC;
关于Mysql日期格式的更多信息在这里
你可以这样做-
SELECT STR_TO_DATE(duedate,'%M '%Y') as due FROM demo ORDER BY due DESC
我不确定,但尝试str_to_date在mysql
参见dem link: SQLFIDDLE
对这些数据进行排序不是特别容易,因为数据库将其视为文本,将按字母数字顺序排序,而不是按日期顺序排序。
最好的解决方案是添加月份和年份字段,并将值存储为整数,然后使用PHP date()格式输出字符串值。然后你可以按你想要的整数排序
或者,您可以在查询中使用FIELD
关键字进行排序,但这不是最好的方法
SELECT * FROM YOURTABLE ORDER BY FIELD(duedate, 'May 13', 'Jun 13', 'Jul 13', ....)