基于Days表与Week Ending Date表计算每周工作日天数的SQL方案选型
方案选择:用全量日期表(All Days)更简便
为啥选全量日期表?
- 不用额外维护数据:全量表包含所有日期,不用手动更新工作日、假日的变动,省得漏改出错
- 设计视图操作更省事:直接在全量表上做筛选+分组,步骤更少,不用额外关联其他表
- 逻辑一目了然:直接通过
日期标记=1筛选工作日,自动排除周六日(标记2)和假日(标记3),不用额外处理复杂规则
设计视图操作步骤(以Access为例,其他数据库逻辑一致)
- 打开设计视图,把全量日期表(All Days)拖进视图
- 如果表本身没有「周末结束日期」字段,新建计算字段:在字段行输入
周末结束日期: DateAdd("d", 4 - Weekday([日期]), [日期])(这个公式会把每个日期对应到当周周五) - 拖入「日期标记」字段,在条件行输入
1 - 点击工具栏的「总计」按钮(Σ图标):
- 把「日期」字段的总计类型改成「计数」
- 把「周末结束日期」的总计类型改成「分组」
- 把「日期标记」的总计类型改成「条件」
- 运行查询,就能得到每周(以周五为结束)的工作日天数
简单SQL参考(供理解用)
-- SQL Server版本,日期函数根据数据库调整 SELECT DATEADD(day, 4 - DATEPART(weekday, [日期]), [日期]) AS 周末结束日期, COUNT([日期]) AS 工作日天数 FROM [All Days] WHERE [日期标记] = 1 GROUP BY DATEADD(day, 4 - DATEPART(weekday, [日期]), [日期])
为啥不推荐工作日表?
- 维护麻烦:每次有新假日或者日期调整,都要手动更新工作日表,容易遗漏
- 操作更复杂:设计视图里需要关联工作日表和周末结束日期表,步骤多,对SQL经验少的人不友好
- 逻辑容易乱:如果工作日表没自带周结束日期,还要额外计算或关联,增加出错概率
内容的提问来源于stack exchange,提问作者RegisDC7
相关产品推荐
相关产品推荐

