按日期字段排序,这是数据库中的VARCHAR

时间:2013-07-22 21:00:41

标签: php mysql

全部, 我有以下查询:

  

选择...
  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),因为我搞砸了那个设计。有没有办法更改我的查询,以便正确排序日期?

谢谢!

5 个答案:

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

以上是对上述代码的解释:

  1. 在表格中创建新列。
  2. 使用正确格式化上一列的日期填充新列。
  3. 删除旧的格式错误的列。
  4. 将新列重命名为以前的列名称。

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

首先按年排序,然后按月排序,最后按天排序...