2009-06-02 124 views
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 
    sortdate DESC 

以上是代码和它的作品,但日期没有排序例如,它排序是这样的:

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

是“pub_date”表中的字符串字段? – 2009-06-02 16:13:18

回答

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列确实必须是字符串吗?为什么不把它作为一个更合适的数据库类型来开始,以避免所有的解析?

+0

谢谢,这个工作,我不得不稍微改变它通过删除AS Formatted_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')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“; – Ddywalgi 2009-06-02 16:40:58

+0

谢谢,日期是一个javascript drop calendar picker,它将隐藏的字符串传递给数据库。我现在试图将日期转换为RSS将验证的格式。非常感谢你的帮助。我对此很新,日期让我转动。再次感谢Jon和所有贴出来的人,你们都有很大的帮助。 – Ddywalgi 2009-06-02 16:45:07

+0

那么DATE_FORMAT值是什么(按列名称)?我的SQL-fu相当弱,但我不明白为什么它会失败,并带有名称...... – 2009-06-02 16:45:39

-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 

里面的查询,所以当y按sort_date排序,按字符串排序。 通过

ORDER BY pub_date DESC 

更换排序顺序,一切都应该工作。

+0

嗨Nathaniel,我使用这个当前的语法,但它不会排序日期月份降序。 //“SELECT u.url_id,url,title,description,pub_date,DATE_FORMAT(STR_TO_DATE(pub_date,'%d-%b-%Y'),'%Y.%m。%d')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“; // 感谢您的帮助 – Ddywalgi 2009-06-02 16:34:07

+0

问题在于您现在正在选择只是pub_date,这是一个字符串。如果你使用这个查询,你应该使用ORDER BY u DESC。 – 2009-06-02 16:36:27

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 
+0

尽管如此,这仍然是通过*字符串*而不是*日期来排序的,不是吗? – 2009-06-02 16:23:28

+0

不幸的是,我今天只能访问ORACLE,所以我无法验证在ORACLE中,我刚刚测试过它,它可以正确使用to_char(created_dt,'dd/MON/yyyy'),它也返回一个字符串。限制是它的日子,然后几个月。您可以通过订单中的额外date_format字符串进一步细分出更多的月份 – northpole 2009-06-02 16:31:49

+0

,或者您甚至可以先按年份/月/日顺序切换订单。 – northpole 2009-06-02 16:36:26

1

它看起来像 “PUB_DATE” 是一个字符串场?如果是这样,你需要将其转换为日期时间,以便按照预期进行排序。

1

你告诉查询进行排序转换后的字符串,这意味着它是做一个,而不是一个日期排序。尝试按pub_date排序。

+0

看起来像pub_date是一个字符串,无论如何,给STR_TO_DATE打电话...... – 2009-06-02 16:23:52

+0

Arrgh。伟大的先生,你永远是对的。你击败了我的修改答案。我明白为什么有完整的问题致力于你的迷人。 http://stackoverflow.com/questions/305223/jon-skeet-facts – 2009-06-02 16:32:18

0

要排序这样的..

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

但是如果可以的话,记错,你应该考虑从字符串变换基座列日 - 很多原因:可扩展性,性能,可维护性,数据的完整性,亚达yada yada。