我有一张带有ID的表,一个发生事件的日期时间,以及它的描述。
通过该表,我能够查询一周中某天发生的事件的次数,并具有以下内容:
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 :(得分: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;