2009-06-02 123 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。