如何在指定日期区间内统计周五数量(无需依赖任何表)
统计指定日期区间内周五的数量(无数据表依赖)
原SQL的问题说明
你写的SQL存在几个关键问题:
- 没有生成目标日期区间的数据源,
WHERE子句没有对应的数据集支撑 DAYNAME函数用法错误,正确写法是DAYNAME(日期字段)而非直接赋值判断- 日期常量未加单引号,会被数据库解析为数值运算(比如
2020-05-05会被计算成2010)
实现思路
要在无数据表依赖的情况下完成统计,核心是用数据库内置函数生成目标区间内的所有日期,再筛选出周五并计数。以下是主流数据库的具体实现:
MySQL 实现
用递归CTE生成日期序列,再通过DAYNAME函数筛选周五:
WITH RECURSIVE date_range AS ( SELECT '2020-05-05' AS date UNION ALL SELECT DATE_ADD(date, INTERVAL 1 DAY) FROM date_range WHERE date < '2020-06-09' ) SELECT COUNT(*) AS friday_count FROM date_range WHERE DAYNAME(date) = 'Friday';
PostgreSQL 实现
用generate_series直接生成日期序列,通过EXTRACT(DOW)判断周五(PostgreSQL中DOW取值为0=周日,4=周五):
SELECT COUNT(*) AS friday_count FROM generate_series('2020-05-05'::date, '2020-06-09'::date, '1 day'::interval) AS date_range(date) WHERE EXTRACT(DOW FROM date) = 4;
SQL Server 实现
用递归CTE生成日期序列,通过DATENAME筛选周五,注意开启递归限制:
WITH date_range AS ( SELECT CAST('2020-05-05' AS DATE) AS date UNION ALL SELECT DATEADD(DAY, 1, date) FROM date_range WHERE date < CAST('2020-06-09' AS DATE) ) SELECT COUNT(*) AS friday_count FROM date_range WHERE DATENAME(WEEKDAY, date) = 'Friday' OPTION (MAXRECURSION 0); -- 区间超过100天需开启此选项
结果验证
2020-05-05至2020-06-09区间内的周五分别是:5月8日、15日、22日、29日,6月5日,共5个,上述SQL执行后会返回5。
内容的提问来源于stack exchange,提问作者Mohamed adel
相关产品推荐
相关产品推荐

