You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指定日期区间内统计周五数量(无需依赖任何表)

统计指定日期区间内周五的数量(无数据表依赖)

原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:55:17