1

所有,我有以下查询:

SELECT ...
FROM....
WHERE ...
ORDER BY gear_checkout_summary.check_out_date DESC";

然后我有以下日期,例如:
12/29/2012
11/30/2012
09/04/2012
07/21/2013
07/08/2013
06/29/2013

当我的结果返回时,它们会以这种方式排序。我的数据元素在我的数据库中存储为 VARCHAR(10),因为我搞砸了那个设计。有没有办法更改我的查询,以便正确排序日期?

谢谢!

4

5 回答 5

5

尝试这个:

ORDER BY SUBSTR(check_out_date, 7) DESC, check_out_date DESC

这首先使用该SUBSTR()功能按年订购。对于具有相同年份的行,它然后按日期本身排序。这个二级排序不需要SUBSTR(),因为MM/DD已经正确排序。

于 2013-07-22T21:03:33.830 回答
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 字段转换为日期格式。

于 2013-07-22T21:03:48.420 回答
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. 将新列重命名为以前的列名。
于 2013-07-22T21:19:02.877 回答
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... 这是存储日期的最简单和最干净的方式。

于 2013-07-22T21:16:55.070 回答
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

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

于 2021-03-25T21:18:14.863 回答