2012-07-05 56 views
0

我想選擇兩個日期範圍之間的數據。然而並非所有數據都是每天插入的。下面是該表的示例:選擇不存在的數據用MySQL,

mysql> SELECT * FROM attendance; 
+------------+-------+ 
| date  | total | 
+------------+-------+ 
| 2012-07-02 | 100 | 
| 2012-07-04 | 70 | 
| 2012-07-05 | 78 | 
+------------+-------+ 
3 rows in set (0.00 sec) 

該場景是我想要從2012-07-02到2012-07-04的總出勤人數。根據以上數據,我會得到

mysql> SELECT * FROM attendance WHERE date BETWEEN '2012-07-02' AND '2012-07-04'; 
+------------+-------+ 
| date  | total | 
+------------+-------+ 
| 2012-07-02 | 100 | 
| 2012-07-04 | 70 | 
+------------+-------+ 
2 rows in set (0.00 sec) 

但是我的目標是讓2012-07-03包含在結果中。

+------------+-------+ 
| date  | total | 
+------------+-------+ 
| 2012-07-02 | 100 | 
| 2012-07-03 |  0 | 
| 2012-07-04 | 70 | 
+------------+-------+ 

這是可能通過MySQL的做什麼?我確實看過temporary table。但仍然無法達到目標。

回答

0

這是一個簡單的解決方案的共同問題。

創建一個常規表,說REF_DATE,並將其存儲在它的所有日期爲像3年或任何時間跨度您需要。

然後使用此表的左側一LEFT OUTER JOIN

SELECT REF.date,IFNULL(A.total,0) as total FROM REF_DATE REF 
LEFT OUTER JOIN attendance 
ON REF.date=A.date 
A WHERE REF.date BETWEEN '2012-07-02' AND '2012-07-04'; 

DATE的是MySQL中的關鍵字,我在這裏用它的可讀性。使用不同的列名稱。

+0

謝謝。提供的SQL實際上沒有工作。一個小小的修復完成了這項工作。 'SELECT REF.date,IFNULL(A.total,0)作爲總FROM REF_DATE REF LEFT OUTER JOIN出勤甲 ON REF.date = A.date WHERE REF.date BETWEEN '20 -07-02' AND '2012-07-04';' –

+1

向誰低估了這一點 - 請評論你爲什麼低估了它。 – Dojo

0

MySQL不能產生的數據是不存在的。如果您想要不存在的日期,則需要有一個包含您加入的完整日期範圍的臨時表。另一種方法是保持一個服務器端的變量,對於每一行,這是醜陋

select @dateval := '2012-07-02'; 
SELECT @dateval := @dateval + INTERVAL 1 DAY from ... 
1

您可以枚舉日期爲派生的僞表(帶UNION),然後用你的數據

加入它做一些日期數學
SELECT dates.date, COALESCE(attendance.total,0) AS total FROM (
SELECT '2012-07-02' AS date 
UNION ALL SELECT '2012-07-03' 
UNION ALL SELECT '2012-07-04' 
) AS dates 
LEFT JOIN attendance USING(date) 

編輯:添加COALESCE對缺失的記錄返回0而不是NULL

+0

由Priyank提供這個解決方案,一個運作良好。非常感謝你! –