我会查询所有可能日期的calendar 表。例如
CREATE TABLE cal (dt DATE NOT NULL, PRIMARY KEY (dt)) ;
填充了我们正在检查的两个日期之间的所有日期,
INSERT INTO cal (dt) VALUES ('2019-01-01'),('2019-01-02'),('2019-01-03'),...
还有其他方法可以生成一组行,而无需调用静态的预构建日历表。我们只需要足够的行,以及在两个边界之间生成不同日期值的方法。其他数据库有一些很好的方法来生成整数序列。我们可以让 MySQL 通过一些混乱的 UNION ALL 和 CROSS JOIN 操作生成有限的行负载)
但是我们生成行,方法是一样的:
条件聚合。我们可以得到两个边界之间的一组日期值。确定该日期是否被视为星期三,并分别返回 1 或 0。将所有行折叠成一行,并将 1 和 0 相加得到计数。
类似这样的:
SELECT SUM(IF(WEEKDAY(c.dt)+1 = 3 ,1,0)) AS cnt_wednesdays
FROM cal c
WHERE c.dt >= '2020-01-01' + INTERVAL 0 DAY
AND c.dt < '2020-01-24' + INTERVAL 0 DAY
注意事项:
MySQL WEEKDAY() 函数 0 = 星期一,1 = 星期二,... 6 = 星期日
MySQL DAYOFWEEK() 函数:1 = 星期日,2 = 星期一,... 7 = 星期六
如果下限和/或上限日期在星期三,是否应将其视为包含在内的“星期三”?
例如,考虑从周三 1 月 2 日 '2019-01-02' 到周三 1 月 9 日 '2019-01-09' 的范围;我们要返回 0、1 或 2 的“星期三”计数吗?
根据需要调整比较运算符 > / >= 和 < / <= 中包含/排除的相等性以包含/排除边界日期。