2012-11-28 26 views
1

我想將存儲在mysql數據庫中的日期轉換爲VARCHAR(格式示例:2012年12月29日),然後我想對它進行排序,以便舊版日期位於頂端之後是當前日期。PHP&MySQL's STR_TO_DATE

Eg: 
11-01-2012 
11-05-2012 
12-25-2012 
... 

這裏是我到目前爲止,(請幫助!感謝)

<?php 
     $listsql = "SELECT contact.id, CONCAT(lastname,', ',firstname) AS fullname, lastname, firstname, 
        STR_TO_DATE(daDATE,'%m-%d-%Y'), line1, line2, city, state, zip, phone1, phone2, country, whoAdded 
        FROM ". TABLE_CONTACT ." AS contact 
        LEFT JOIN ". TABLE_ADDRESS. " AS address ON contact.id=address.id AND contact.primaryAddType=address.type 
        LEFT JOIN ". TABLE_EMAIL ." AS email ON contact.id=email.id AND contact.primaryAddType=email.type 
        WHERE contact.hidden != 1 
        ORDER BY email.daDATE"; 
?> 
+7

強烈建議將列的數據類型更改爲適當的DATETIME並在其中存儲實際日期值。 –

+1

您上面的'STR_TO_DATE()'是'%m-%d-%Y',但您的示例數據是'%m /%d /%Y'。 –

+0

如果它在SQL中的日期正確存儲,那麼你可以使用SQL的ORDER BY子句 –

回答

2

正如評論表明您。您真的應該將字段類型更改爲datedatetime(如果您需要H-M-S信息)。儘管您可以在文本類型字段中的日期值上對字符串進行操作,但您無法使用索引來進行過濾/排序/分組,以便在該字段中進行高效處理。

如果您需要幫助轉換我可能會建議這種方法。添加新的日期或日期時間列。請確保在此列上添加索引,因爲您將使用它進行排序。

然後運行此查詢:

UPDATE table SET new_date_column = STR_TO_DATE(old_date_column, '%m-%d-%Y'); 

然後從表中刪除舊列。

0

您可以使用SUBSTR()INSTR()進行即時訂購以識別日期的每個部分,然後按年份,然後按月份和日期部分進行訂購。像其他人一樣,最好將其存儲爲date或unixtime整數。您可以將其更改爲yyyy-mm-dd,並且orderby會在本機上工作。

如果你堅持可能是最困難的方式,它會是這樣的(年,月,日):

ORDER BY SUBSTR(email.daDATE,INSTR(email.daDATE,'-',2)+1) DESC, 
     SUBSTR(email.daDATE,INSTR(email.daDATE,'-',1)+1,INSTR(email.daDATE,'-',2)-1) DESC, 
     SUBSTR(email.daDATE,0,INSTR(email.daDATE,'-')-1) DESC 

或類似的東西。這是在我頭頂上的飛行,但我認爲這是準確的。如果它不按預期工作,請查看這些功能的使用情況。

+0

不同意有關使用UNIXTIME整數來表示日期數據的註釋。這是由於許多原因造成的,包括數據庫中數據的可讀性,在仍然使用索引時缺乏按日期輕鬆分組或過濾的能力,以及對於日期字段(不是日期時間)的情況導致解決問題,在插入數據之前,您必須將unixtime轉換爲最近的一天。在大多數情況下,您將更好地使用本機日期/時間字段類型在SQL數據庫中表示日期/時間數據。 –

+0

我同意決議問題,我只是從問他在哪裏只有一個月和一年的問題中拿出來。我個人使用datetime或unixtime整數(如果需要,可以稍微加快數學計算),但那不是我回答的問題。用戶想要執行一項不應該執行的任務的複雜技術,因此我決定告訴他一個難以理解(荒謬)的方法來完成它。 – NappingRabbit