MySQL:查询未发生某事的一周中的日期

时间:2014-10-09 16:51:16

标签: mysql datetime

我有一张带有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日以来的星期日有多少个结果?

非常感谢提前!

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;