我想知道是否有人之前遇到过这个问题 我有一个字符串转换为日期并按升序排序。日期按数字排序,但不是按月排序。我想知道是否有人遇到过这个问题,并且可以就如何正确排序日期提供一些见解。
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
答案 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_date
。 formatted_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
一切都应该有效。