2014-03-13 48 views
0

我創造了這個mysql代碼只在特定日期範圍來算,我甩的我的MySQL代碼的輸出,在這裏,它是:如何在特定的日期範圍計算在MySQL

SELECT COUNT(
       IF(
         DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28', 
         1, 
         0 
        ) 
     ) AS 'Feb', 
     COUNT(
        IF(
         DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31', 
         1, 
         0 
        ) 
     ) AS 'March', 
     COUNT(
        IF(
         DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31', 
         1, 
         0 
        ) 
     ) AS 'Jan' 
     FROM 
      database.quotes q 
     WHERE (DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-03-31') 

但這輸出相同計算每個月,其中我確認二月和三月有零計數。我在這裏錯過了什麼?

+0

'date_emailed'的數據類型是什麼? –

+0

@Gordon Linoff:數據類型是datetime – user2881063

回答

1

如果要總結0和1

的計數將計算行數,總和將總結值應使用SUM,而不是COUNT。

+0

他們是mysql的if語句,我認爲1是爲true,0爲false,我是對嗎?我爲什麼要添加它們? – user2881063

+0

COUNT將統計行數,SUM將總結1和0.哪些是您的必需輸出? – Niels

+0

我不想添加任何字段,我只想計算特定日期範圍內引號表中的記錄數。 – user2881063

3

COUNT()計數非空值。您可以改爲使用sum()來修復您的代碼。您也可以通過刪除if語句簡化一下:

SELECT SUM(DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28') AS Feb, 
     SUM(DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31') AS March, 
     SUM(DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31') AS Jan 
FROM database.quotes q 
WHERE DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-03-31'; 

在MySQL中,一個布爾結果被視爲0爲「假」和1爲「真」。這非常方便,並且允許您使用sum()來計算匹配數量。

請注意,我也刪除了列名稱周圍的單引號。單引號應該用於字符串和日期常量,而不是標識符。

編輯:

你可以有這樣的查詢運行通過q.date_emailed使用索引更快。但是,我不認爲該索引將被使用,因爲date()函數。您可以通過更改邏輯來解決此問題:

SELECT SUM(DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28') AS Feb, 
     SUM(DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31') AS March, 
     SUM(DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31') AS Jan 
FROM database.quotes q 
WHERE q.date_emailed >= '2014-01-01' AND 
     q.date_emailed < '2014-04-01'; 
+0

我不想添加任何字段,我只想計算特定日期範圍內引號表中的記錄數。 – user2881063

+0

我不知道你的SUM做了什麼,但它工作。 LOL多謝先生。 – user2881063