为什么我的日期没有正确排序?

时间:2009-06-02 16:11:27

标签: mysql sorting date

我想知道是否有人之前遇到过这个问题 我有一个字符串转换为日期并按升序排序。日期按数字排序,但不是按月排序。我想知道是否有人遇到过这个问题,并且可以就如何正确排序日期提供一些见解。

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date, 
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date,
  pub_date AS sortdate 
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

以上是代码并且它可以工作,但日期不是排序,例如它的排序如下:

 29-may-2009
 28-may-2009
 27-may-2009
 02-june-2009
 01-june-2009

6 个答案:

答案 0 :(得分:4)

我遇到过类似的问题。我所做的(并且只使用ORACLE)是使用orderby中的date_format而不是已经格式化的日期。

所以在您的订单中使用:

DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y') DESC

或 - 首先按年排序

DATE_FORMAT(STR_TO_DATE(pub_date, '%Y-%b-%d') DESC

答案 1 :(得分:4)

好吧,之前我有点困惑。当您在列列表中选择pub_date,然后将转换 作为pub_date时,您的原始查询会有些混乱。但是,您之后按pub_date列进行排序(实际上,给定sortdate as pub_date) - 这似乎是一个字符串列。

您的订购应该在转换为日期之后列上,但之前转换为字符串:

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date,
  STR_TO_DATE(pub_date, '%d-%b-%Y') AS sortdate,
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS formatted_date
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

请注意,我已将“格式化”版本重命名为formatted_date。目前尚不清楚您是否仍需要选择原始pub_dateformatted_date位可能是:

DATE_FORMAT(sortdate, '%d.%b.%Y') AS formatted_date

但我不完全确定。我希望查询优化器无论如何都能解决这个问题。

您的pub_date列真的必须是字符串吗?为什么不把它作为一个更合适的类型保存在数据库中,以避免所有的解析?

答案 2 :(得分:1)

看起来“pub_date”是一个字符串字段?如果是这样,您需要将其转换为datetime以进行排序以按预期工作。

答案 3 :(得分:1)

您告诉查询对转换后的字符串进行排序,这意味着它正在对字符串进行排序,而不是日期。请尝试通过pub_date进行排序。

答案 4 :(得分:0)

你想要这样排序..

ORDER BY DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y')

但是,如果可以的话,那么你应该考虑从字符串更改基本列到目前为止 - 很多原因:可扩展性,性能,可维护性,数据完整性,yada yada yada。

答案 5 :(得分:-1)

尝试

"SELECT u.url_id, url, title, description, pub_date, DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date, pub_date AS sortdate FROM urls AS u, url_associations AS ua WHERE u.url_id = ua.url_id AND ua.url_category_id=$type AND ua.approved = 'Y' ORDER BY pub_date DESC";

问题是你有

 pub_date AS sort_date 

在查询内部,因此当您按sort_date排序时,按字符串排序。   通过

替换排序顺序
ORDER BY pub_date DESC

一切都应该有效。