2016-10-04 88 views
1

我試圖從MySQL中選擇和按日期分組。sql select和group by CURRENT_TIMESTAMP

表看起來像這樣:

`id` int(11) NOT NULL, 
    `run_data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `date_day` varchar(20) NOT NULL, 
    `number_of_links` int(20) NOT NULL, 

的選擇,我使用:

SELECT date_day, SUM(number_of_links) FROM my_table GROUP BY date_day DESC LIMIT 30 

我得到的每一天鏈接總數,但我不能按日期排序。從我的數據庫date_day只是︰

$date_day = date('d/m/Y', time()); 

任何想法如何解決這個問題?

我試過到目前爲止:

GROUP BY TO_DAYS(`run_data`) 
GROUP BY MONTH(run_data) 
GROUP BY DATE(STR_TO_DATE(run_data)); 
+1

也許愚蠢的問題,但你爲什麼不保持你的日期在合適的日期列格式?如日期 – nospor

+0

現在你是複雜的那麼簡單的事情 – nospor

+0

你能告訴保存表格內 –

回答

1

您的date_day字段不可排序。至少不要除非你爲它編寫自定義邏輯,這通常是用PHP完成的;或者在每個查詢上進行投射,這對數據庫來說可能非常昂貴(更不用說提供不正確的結果)。

如由@nospor註釋中,正確回答這個問題是改變的領域是正確的date場。然後,您可以輕鬆地對其進行分類和/或分組。
要做到這一點,我建議就在的ALTER TABLE語法仰視。

+0

謝謝你,怎麼樣'run_data'日期時間NOT NULL DEFAULT CURRENT_TIMESTAMP,?我可以使用它嗎? – fernando

+0

這取決於它是否包含與'date_day'字段相同的數據。由於我不知道答案,所以我不能肯定地說。但是,如果它們包含相同的數據,爲什麼有兩個字段呢? – ChristianF

0

date_dayvarchar型的,所以要排序date_day你的結果,你必須將它轉換成date數據類型,就像這樣:

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY CAST(date_day AS DATE()) DESC 
LIMIT 30 
+0

@Toby謝謝你告訴我 – Ashu

1

假設你date_day存儲像「D/M/Y」你shold字符串轉換的日期格式的字符串

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY str_to_date(date_day, '%d/%m/%Y') DESC 
LIMIT 30 
+0

有什麼格式的他有一個字符串...請不要假設已經給出的東西。 – nospor

+0

@nospor ..在表中的列是一個varchar和我的答案在那裏開始對格式 – scaisEdge

+0

他正好在他有什麼格式的日期表示警報......這是「D/M/Y」不你認爲DD-MM-YYYY – nospor