最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

工作日计算问题思路和实现

来源:懂视网 责编:小采 时间:2020-11-09 14:39:12
文档

工作日计算问题思路和实现

工作日计算问题思路和实现:项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有
推荐度:
导读工作日计算问题思路和实现:项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有

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

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

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

工作日计算问题思路和实现

工作日计算问题思路和实现:项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有
推荐度:
标签: 实现 计算 目前
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top