全部, 我有以下查询:
选择...
FROM ....
WHERE ...
ORDER BY gear_checkout_summary.check_out_date DESC“;
然后我有以下日期例如:
2012年12月29日
2012年11月30日
09/04/2012
2013年7月21日
2013年7月8日
2013年6月29日
返回结果时,它们会以这种方式排序。我的数据元素在我的数据库中存储为VARCHAR(10),因为我搞砸了那个设计。有没有办法更改我的查询,以便正确排序日期?
谢谢!
答案 0 :(得分:5)
试试这个:
ORDER BY SUBSTR(check_out_date, 7) DESC, check_out_date DESC
这首先使用SUBSTR()
函数按年份排序。对于具有相同年份的行,它然后按日期本身排序。此二级排序不需要SUBSTR()
,因为MM/DD
已经正确排序。
答案 1 :(得分:2)
STR_TO_DATE会看到你的工作
STR_TO_DATE(gear_checkout_summary.check_out_date, '%c/%e/%Y') // will give '2013-06-23' in Date format
这会将您的varchar字段转换为日期格式。
答案 2 :(得分:2)
这会将日期设置为正确的MySQL日期格式,然后排序会很简单。
SELECT
STR_TO_DATE(gear_checkout_summary.check_out_date,"%m/%d/%Y") AS fixed_date
...
FROM ...
WHERE ...
ORDER BY fixed_date DESC
正如其他人所说,如果可能的话,你应该在数据库中修改格式。您可能需要更改插入语句,但值得额外的工作。以下是格式化数据库中日期所需的操作
ALTER TABLE gear_checkout_summary ADD check_out_date_temp DATE AFTER check_out_date;
UPDATE gear_checkout_summary SET check_out_date_temp = STR_TO_DATE(gear_checkout_summary.check_out_date,"%m/%d/%Y");
ALTER TABLE gear_checkout_summary DROP check_out_date;
ALTER TABLE gear_checkout_summary CHANGE check_out_date_temp check_out_date DATE;
以上是对上述代码的解释:
答案 3 :(得分:1)
使用str_to_date
:
select *
from your_table
order by STR_TO_DATE(yourDateField,'%m/%d/%Y') desc;
这会将字符串转换为有效的MySQL日期。请检查此链接:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date
您应将您的数据类型更改为DATE
...这是存储日期的最简单,最简洁的方法。
答案 4 :(得分:0)
我尝试了所有代码,最后我使用此代码实现了对 varchar 日期的排序...
ORDER BY SUBSTR(check_out_date, 7) DESC, ORDER BY SUBSTR(check_out_date, 1,2) DESC,ORDER BY SUBSTR(check_out_date, 4,2) DESC
首先按年排序,然后按月排序,最后按天排序...