2011-10-02 66 views
0

如果我有MySQL查詢像這樣的開始日期,每週總結詞頻:獲取星期使用MySQL

SELECT 
    SUM(`city`), 
    SUM(`officers`), 
    SUM(`uk`), 
    SUM(`wednesday`), 
    DATE_FORMAT(`dateTime`, '%d/%m/%Y') 
FROM myTable 
WHERE dateTime BETWEEN '2011-09-28 18:00:00' AND '2011-10-29 18:59:00' 
GROUP BY WEEK(dateTime) 

由MySQL給出的結果採取列日期時間的第一個值,在這種情況下,28/09/2011恰好是星期六。

是否可以在MySQL中調整查詢以顯示一週開始的日期,即使沒有可用的數據,因此對於上述情況,2011-09-28將替換爲2011/09 /而不是26?也就是星期一開始的日期。或者,在查詢運行後以編程方式調整日期會更好嗎?

日期時間列是格式2011/10/02 12:05:00

回答

0

這是可能做到這一點的SQL,但它會更好做在你的程序代碼,因爲它會更有效並且更容易。另外,雖然MySQL接受您的查詢,但它不太合理 - 您在0123的選擇字段列表中有DATE_FORMAT(dateTime, '%d/%m/%Y'),而您通過WEEK(dateTime)進行分組。這意味着數據庫引擎必須從當前組(每週)中爲每行選擇隨機日期。也就是說,你認爲你有記錄27.09.201128.09.201129.09.2011-它們都在同一周,所以在最終結果集中,這三條記錄只產生一行。那麼應該爲DATE_FORMAT()調用挑選哪三個日期?如果查詢中有ORDER BY,回答會稍微簡單一些,但在字段列表中使用不在GROUP BY中的字段/表達式或不是聚合的字段/表達式並不合適。您應該真的返回選擇列表中的星期數(而不是DATE_FORMAT調用),然後在您的代碼中計算它的開始日期和結束日期。

+0

不知道我很理解你的答案。 MySQL給了我每週GROUP BY的第一行的日期時間,並且對於結果中的每個dateTime,我使用DATE_FORMAT格式化dateTime。 –

+1

@MrMorgan,ain表示您的查詢有邏輯錯誤。它是不確定的。 group by將會一起扔多行,但只會顯示這些行中的一行**。您選擇的非聚合字段應始終在功能上依賴於group by子句。最簡單的方法是在group by子句中重複** all **非聚合選擇。 – Johan

+0

@Johan:你能澄清一下嗎? –