2014-10-09 50 views
1

我有一張ID,一個發生了什麼日期時間的表以及它是什麼的描述。MySQL:查詢某一天沒有發生的日期

mysql> select distinct(DATE(HEADER_DATE)) from emails_inbound where WEEKDAY(HEADER_DATE) = 6; 
+---------------------+ 
| (DATE(HEADER_DATE)) | 
+---------------------+ 
| 2014-09-21   | 
| 2014-09-28   | 
| 2014-10-05   | 
+---------------------+ 
3 rows in set (0.00 sec) 

我想看到的是一個數:

與該表,即在該日的一週與下面出現的東西我已經能夠查詢的次數一週中的週日數(在本例中爲星期日),從某天開始沒有任何事件發生(當天沒有返回結果)。

換句話說,自2014年9月1日以來有多少個星期日包含零結果?

非常感謝提前!

+0

明顯不是一個函數 – Strawberry 2014-10-09 17:43:41

+0

我要去承擔這個本來是爲我的答案註釋,不是這個問題。謝謝你的收穫!我修復了我的答案。 – Ruslan 2014-10-09 17:48:25

回答

2

只需將一張臨時表放在一起,該表就會在您希望的日期範圍內爲您提供每天的排名,然後LEFT JOIN與您的主表和GROUP BY工作日相對。

我沒有MySQL在我的處置,這似乎很難做SQLFiddle(混合架構&非模式語句),但下面的代碼應該按原樣或只有很小的調整。請注意,我認爲您的emails_inbound表中的ID列被稱爲id;如果是其他內容,請將e.id更改爲e.whatever

drop temp table if exists t_tmp; 

create temp table t_tmp (
my_date date 
) engine=memory; 

declare v_startDate date; 
declare v_endDate date; 

set v_startDate = '10-1-2014'; -- YOUR START DATE 
set v_endDate = '10-10-2014'; -- YOUR END DATE 

while (v_startDate < v_endDate) do 
    insert into t_tmp values (v_startDate); 
    set v_startDate = v_startDate + interval 1 day; 
end while; 

select weekday(date(e.header_date)) as day_of_week, 
     count(e.id) as number_of_days_when_this_event_happened, 
     sum(case when e.id is not null then 0 else 1 end) as number_of_days_when_this_event_did_not_happen 
from t_tmp x 
    left join emails_inbound e on date(e.header_date) = x.my_date 
group by weekday(date(e.header_date)) 

drop temp table t_tmp;