工作日计算问题思路和实现
项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。
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
工作日计算问题思路和实现相关推荐
- mysql按工作日查询统计优化_工作日计算问题思路和实现
项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少.为了简化这个问题,需要下面几个假设. 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交 ...
- java计算工作日_Java工作日计算工具类
工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...
- 星期和工作日计算,你会了吗?
1.计算某个日期是星期几 如下图,是宅男心中的大事记,要计算发生日期是周几,公式为: =WEEKDAY(B2,2) WEEKDAY函数第二参数使用2,用数字1到7表示周一到周日.这个函数在数组计算中经 ...
- 一种关于感受野尺寸计算的思路
前文的思路存在问题,文末部分进行了更正. Preface 知道这个词一年多了,还记得当时的情景,当时没有涉及到CNN就过去了,后面才知道是一个有趣的事物.前不久打算估计一下网络的这一指标,发现并不那么 ...
- Java判断工作日计算,计算随意2个日期内的工作日
当前位置:我的异常网» Java Web开发 » 计算随意2个日期内的工作日 计算随意2个日期内的工作日 www.myexceptions.net 网友分享于:2013-08-17 浏览:51次 ...
- c#五个自然日 工作日计算_C#程序输入工作日编号并打印工作日
c#五个自然日 工作日计算 从工作日编号打印工作日名称 (Printing weekday name from weekday number) A switch statement allows ch ...
- java 剔除工作日计算超时时间
剔除工作日计算超时时间 import com.alibaba.fastjson.JSONObject;import java.math.BigDecimal; import java.text.Par ...
- php工作日,计算工作日(jessie看)-PHP教程,PHP应用
现在还有问题 周一,周二不能做节假日 可能算法上还有问题,等待你的更新- /** * sports98 * flyruns@hotmail.com (欢迎交流) */ ================ ...
- Excel工作日计算时,怎样去除周末和节假日
截图备份.原文章:http://www.360doc.com/content/19/0811/17/57800475_854262331.shtml 问题:有两个日期,我要计算它们之间有多少个工作日, ...
最新文章
- HTML Window.document
- 【OH】Oracle软件安装需要的软件包(官方文档)
- UE把环境变量Path改了
- IBM首席执行官提出人工智能部署三大基本原则
- C# .net中cookie值为中文时的乱码解决方法
- Java机器学习库ML之七分类预测输出概率值
- 贷款,别相信这些人!
- mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
- php与mysql关系大揭秘_【慕课笔记】PHP与MySQL关系大揭秘
- 组织架构递归_映射架构和递归管理数据–第2部分
- [转载] Python学习笔记 String类型常用方法
- 关于maven各种报错
- IBM X3650 M4服务器使用U盘重装系统教程
- vue day13 网易云项目(歌词)
- 用Java开发手机Andriod系统Apk软件
- wps如何只让他显示3级标题_WPS如何三级标题
- 记实现多racecar仿真过程中遇到的问题(一)
- DVE 查看覆盖率方法
- 几招紧急应对夏天雷雨天机房断电的方法!
- hanlp自然语言处理包的基本使用--python
热门文章
- nginx安装、nginx前端配置、后端配置、前后端分离配置、https支持(ssl配置)、负载均衡配置、nginx location详解
- 同轴电缆传输容易出现哪些干扰?
- SIMULIA现实仿真解决方案 SIMULIA仿真模拟应用程序
- hp服务器光盘安装win7系统安装教程,惠普win7系统安装方法,教您惠普win7系统怎么安装...
- 说说Laya微信小游戏适配问题
- 算符优先算法c语言,c语言实现算符优先语法分析
- LinuxMint安装后的简单配置
- 招商银行信用卡中心笔试
- 有关REST的一些内容
- 免费生成!火爆全网的个人行程卡纪念版!