2013-08-21 228 views
1

我一直在Google和SO搜索最後25分鐘搜索如何在MySQL中執行以下操作。在日期範圍內計算每個日期的行數

目前,我有以下查詢(通過PHP發送):

SELECT 
    COUNT(*), 
    `$db`.`crop`.`id` AS `crop`, 
    `$db`.`crop`.`harvest_date` AS `harvest_date` 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 
GROUP BY `$db`.`crop`.`harvest_date` 

$startDate = 2012-01-01 
$endDate = 2013-07-01 

我試圖找到所有已開始和結束日期之間的harvest_date行,再算上那年秋天的行數在同一天。但是,我似乎沒有得到任何結果。查詢不會失敗,它只是不會返回任何內容。任何人都可以指出我正確的方向/告訴我我錯了嗎?

編輯:發現問題。正如Michael在下面指出的那樣,日期並沒有像日期那樣通過,而是數字。我通過在查詢中的startDate和endDate之前和之後添加了解決方案。

+1

應該爲查詢失敗。你的日期文字需要用單引號字符串。如''startDate ='2012-01-01'' –

+1

當您通過'harvest_date'進行分組時,您必須使用某種聚集函數(例如'min()','max()'或'group_concat )''爲'id'。 – cars10m

+0

哪種類型是'harvest_date'? –

回答

3

MySQL期望日期文字爲單引號字符串,如'2012-01-01''2013-07-01'

由於您沒有引用PHP變量的日期文字,PHP實際上在將整數值傳遞給查詢之前將其解釋爲整數值的算術運算。

// You see this: 
$startDate = 2012-01-01 
$endDate = 2013-07-01 

// PHP does this: 
// 2012 - 1 - 1 = 2010 
$startDate = 2010 
// 2013 - 7 - 1 = 2005 
$endDate = 2005 

您所查詢的最終使用這樣的:

WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN 2010 AND 2005 

和MySQL會投這兩個整數的DATE,將返回NULL

mysql> SELECT CAST(2010 AS DATE); 
+--------------------+ 
| CAST(2010 AS DATE) | 
+--------------------+ 
| NULL    | 
+--------------------+ 

所以簡單的解決方法是:

$startDate = '2012-01-01'; 
$endDate = '2013-07-01'; 

如果你最終將它轉換爲一個參數化查詢,佔位符的正確引用願意爲你辦理。

1

獲得給定日期範圍之間的計數。將查詢修改爲

SELECT 
    COUNT(`$db`.`crop`.`id`), 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 

將結果分組爲「harvest_date」將決定該特定日期的計數並對它們進行分組。

例如: 如果表等

2013年8月21日

2013年8月21日

2013年8月20日

然後分組會給

不進行分組