项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。

1. 不考虑周六周日,将其视作普通工作日

2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有一个其它的节日

给出假日表的设计,某个假日都有起始时间和结束时间,这里只取月日,这样就能表示每一年的假日。

CREATE TABLE [dbo].[holiday]([begin_time] [varchar](50) NULL,[end_time] [varchar](50) NULL
) ON [PRIMARY]GO

插入测试数据,例如插入国庆节的假日

给定查询时间段为从2014-09-30至2014-10-08,这期间的工作日

declare @query_begin datetime      --查询起始时间
declare @query_end datetime        --查询结束时间
declare @year1 int
declare @year2 int
declare @yeartemp int
declare @total_holidays int
set @query_begin = '2014-09-01'
set @query_end = '2015-01-31'
set @year1 = YEAR(@query_begin)
set @year2 = YEAR(@query_end)
--存储所有的含有年月日的假期
IF object_id('tempdb..#temp') is not null
BEGIN
drop table #temp
END
CREATE table #temp
(
begin_time date,
end_time date,
)
insert into #temp
select convert(varchar(4),@year1)+'-'+begin_time, convert(varchar(4),@year1)+'-'+end_time
from holiday
--这里主要考虑查询时间段跨年的情况
set @yeartemp=@year1+1
while @yeartemp<=@year2
begin
insert into #temp
select convert(varchar(4),@yeartemp)+'-'+begin_time, convert(varchar(4),@yeartemp)+'-'+end_time
from holiday
set @yeartemp=@yeartemp+1
end
--去掉和查询时间段没有一点交集的假日段
delete from #temp
where end_time<@query_begin or begin_time>@query_end
select @total_holidays= SUM(DATEDIFF(dd,begin_time,end_time)+1)
from
(
select case when begin_time<@query_begin then @query_begin else begin_time end as begin_time,
case when end_time>@query_end then @query_end else end_time end as end_time from #temp
) t
select DATEDIFF(DD,@query_begin,@query_end)+1-@total_holidays
drop table #temp

执行该脚本就可以得到结果是2,符合预期。下面给出一些特殊测试用例,验证脚本是否能正确计算工作日。

1. 查询时间为2014-10-05至2014-10-08

结果:1

2. 查询时间为2014-09-30至2014-10-07

结果:1

3. 增加一条假日,例如是教师节,查询时间段为2014-09-01至2014-10-08

结果:30

4. 在增加一条假日记录,元旦,查询时间段为2014-09-01至2015-01-31

现在holiday表的记录为:

如果手动去算就是:30+31+30+31+31-7-1-1=144

实际结果:144

工作日计算问题思路和实现相关推荐

  1. mysql按工作日查询统计优化_工作日计算问题思路和实现

    项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少.为了简化这个问题,需要下面几个假设. 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交 ...

  2. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

  3. 星期和工作日计算,你会了吗?

    1.计算某个日期是星期几 如下图,是宅男心中的大事记,要计算发生日期是周几,公式为: =WEEKDAY(B2,2) WEEKDAY函数第二参数使用2,用数字1到7表示周一到周日.这个函数在数组计算中经 ...

  4. 一种关于感受野尺寸计算的思路

    前文的思路存在问题,文末部分进行了更正. Preface 知道这个词一年多了,还记得当时的情景,当时没有涉及到CNN就过去了,后面才知道是一个有趣的事物.前不久打算估计一下网络的这一指标,发现并不那么 ...

  5. Java判断工作日计算,计算随意2个日期内的工作日

    当前位置:我的异常网» Java Web开发 » 计算随意2个日期内的工作日 计算随意2个日期内的工作日 www.myexceptions.net  网友分享于:2013-08-17  浏览:51次 ...

  6. c#五个自然日 工作日计算_C#程序输入工作日编号并打印工作日

    c#五个自然日 工作日计算 从工作日编号打印工作日名称 (Printing weekday name from weekday number) A switch statement allows ch ...

  7. java 剔除工作日计算超时时间

    剔除工作日计算超时时间 import com.alibaba.fastjson.JSONObject;import java.math.BigDecimal; import java.text.Par ...

  8. php工作日,计算工作日(jessie看)-PHP教程,PHP应用

    现在还有问题 周一,周二不能做节假日 可能算法上还有问题,等待你的更新- /** * sports98 * flyruns@hotmail.com (欢迎交流) */ ================ ...

  9. Excel工作日计算时,怎样去除周末和节假日

    截图备份.原文章:http://www.360doc.com/content/19/0811/17/57800475_854262331.shtml 问题:有两个日期,我要计算它们之间有多少个工作日, ...

最新文章

  1. HTML Window.document
  2. 【OH】Oracle软件安装需要的软件包(官方文档)
  3. UE把环境变量Path改了
  4. IBM首席执行官提出人工智能部署三大基本原则
  5. C# .net中cookie值为中文时的乱码解决方法
  6. Java机器学习库ML之七分类预测输出概率值
  7. 贷款,别相信这些人!
  8. mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
  9. php与mysql关系大揭秘_【慕课笔记】PHP与MySQL关系大揭秘
  10. 组织架构递归_映射架构和递归管理数据–第2部分
  11. [转载] Python学习笔记 String类型常用方法
  12. 关于maven各种报错
  13. IBM X3650 M4服务器使用U盘重装系统教程
  14. vue day13 网易云项目(歌词)
  15. 用Java开发手机Andriod系统Apk软件
  16. wps如何只让他显示3级标题_WPS如何三级标题
  17. 记实现多racecar仿真过程中遇到的问题(一)
  18. DVE 查看覆盖率方法
  19. 几招紧急应对夏天雷雨天机房断电的方法!
  20. hanlp自然语言处理包的基本使用--python

热门文章

  1. nginx安装、nginx前端配置、后端配置、前后端分离配置、https支持(ssl配置)、负载均衡配置、nginx location详解
  2. 同轴电缆传输容易出现哪些干扰?
  3. SIMULIA现实仿真解决方案 SIMULIA仿真模拟应用程序
  4. hp服务器光盘安装win7系统安装教程,惠普win7系统安装方法,教您惠普win7系统怎么安装...
  5. 说说Laya微信小游戏适配问题
  6. 算符优先算法c语言,c语言实现算符优先语法分析
  7. LinuxMint安装后的简单配置
  8. 招商银行信用卡中心笔试
  9. 有关REST的一些内容
  10. 免费生成!火爆全网的个人行程卡纪念版!