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

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

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 @[email protected]+1
while @yeartemp<[email protected]
begin
    insert into #temp
    select convert(varchar(4),@yeartemp)+‘-‘+begin_time, convert(varchar(4),@yeartemp)+‘-‘+end_time
    from holiday
    set @[email protected]+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)[email protected]_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

时间: 2024-11-08 21:30:07

工作日计算问题思路和实现的相关文章

一个简单的工作日计算

一个简单的工作日计算: function getWorkDay(dtBegin:TDateTime;IncDays:Integer):TDateTime; const days: array[1..7] of string=('7','1','2','3','4', '5','6'); var week1:string; x:integer; begin //日期 x:=1; while (x<=IncDays) do begin //判断是否周末 week1:=days[DayOfWeek(d

工作日计算

因工作需要,需要编写一个在指定日期后自动加上几天的计算工作日期,需要自动越过假期和周六.周日(上班还不能越过如2014-01-26日) 比如2014-09-25, 加1天就是2014-09-26, 加2天就是2014-09-29, 加3天就是2014-09-30, 加4天就是2014-10-09, 加5天就是2014-10-10, 加6天就是2014-10-13 网上有类似的基本都不能,只能自己写一个 1 print 'compiling procedure dbo.workday_add ..

关于视觉计算的思路

在研究有穷状态机的过程中,我无意发现四则运算问题 ,计算机程序与人的解决方式差异居然如此之大. 在计算机程序设计上,往往使用栈和树,将计算表达式解析拆分,然后依次求解. 而人不是这么回事. 人类(至少我),从小接受数学解题训练.遇到了数学表达式,顺序是: 1. 大致看一下整个表达式 2. 了解表达式结构后尝试用公式 化简或归并(使用特殊技巧转换表达式形式) 3. 对先乘除后加减十分敏感,当同时在相近区域看到乘除与加减时,会迅速先做乘除,后做加减.加减部分短暂时间内几乎被忽略. 4. 对诸如100

PostgreSQL 当月最后一天的工作日 , 计算日期是星期几

可以用pg自带函数select extract(dow from current_date),之所以没用主要是展示一下通过数学方法计算日期的原理. drop function if exists getDateWeek(date);drop function if exists intervalDay(date);drop function if exists getMonMaxDay(integer,integer);drop function if exists getMonMaxDate(

全球导航网格码(GNGC)计算模型的进一步研究

全球导航网格码(GNGC)计算模型的进一步研究 李  滨 (北京大学遥感与地理信息系统研究所,北京 100871,[email protected]) 著名的数学软件Mathematica的发明人是数学家.物理学家.计算机学家沃尔夫勒姆博士(Stephen Wolfram,1959-).他在二零零二年出版了一本专著:<A New Kind of Science>.在这本书中他系统的表达了他的理念:自然界的本质是计算,但计算的本质必须用实验探索.无论是简单或复杂的数学问题(如对2开平方),还是普

高精度整数计算

        这部分主要是学习一下计算  无法用内置整数类型来保存它的值(即位数多到long long都表示不了)  的整数的加法和乘法         这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项.  下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加 题目描述 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数

大整数加法计算

普通数字的运算,我们可以直接运用已有类型int, long, long long等等计算,但要是数字非常大,这些类型是远远装不下的. 故而很多情况下需要我们自己来设置大整数运算,本篇记录的是大整数的加法运算的方法. 对于加法运算,第一个方法是模拟手算.先来看看手算的步骤: 手算的时候,我们会先把个位相加,有进位则向前进一位,然后计算下一位,重复此步骤.若两个数的位数不同,计算时我们会把位数长的放在上面,位数短的放在下面.短位的数加完后,长位的数则和0相加. 实现加法计算的思路很简单,首先把数字都

解读 2018:13 家开源框架谁能统一流计算?

018 年接近尾声,我018 年接近尾声,我策划了"解读 2018"年终技术盘点系列文章,希望能够给读者清晰地梳理出重要技术领域在这一年来的发展和变化.本文是实时流计算 2018 年终盘点,作者对实时流计算技术的发展现状进行了深入剖析,并对当前大火的各个主流实时流计算框架做了全面.客观的对比,同时对未来流计算可能的发展方向进行预测和展望.策划了"解读 2018"年终技术盘点系列文章,希望能够给读者清晰地梳理出重要技术领域在这一年来的发展和变化.本文是实时流计算 20

java计算方差、标准差(均方差)

java计算标准差思路 1 //方差s^2=[(x1-x)^2 +...(xn-x)^2]/n 或者s^2=[(x1-x)^2 +...(xn-x)^2]/(n-1) 2 public static double Variance(double[] x) { 3 int m=x.length; 4 double sum=0; 5 for(int i=0;i<m;i++){//求和 6 sum+=x[i]; 7 } 8 double dAve=sum/m;//求平均值 9 double dVar=