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

lxjshuju lxjshuju     2022-09-06     513

关键词:

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

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





k3cloud的整体开发思路

参考技术A开放性基于云计算技术提供开发和应用服务,开发伙伴可以基于开发方便、快速完成开发,基于应用服务实现与客户咨询、体验与交易等的应用完整生命周期管理。动态性基于K3CloudBOS云,所有K3Cloud的标准应用、行业和... 查看详情

缓存实现思路(代码片段)

...存。其它的诸如缓存过期,更新缓存等没有实现--!!代码计算接口,用到了装饰者模式。publicinterfaceComputable<A,V>Vcompute(A 查看详情

二.hive问题排查及调优思路(代码片段)

1.使用explain查看HiveSQL的执行计划2.学习大数据分布式计算的基本原理其实不仅仅是MapReduce在数据处理时将所有的数据简化成业务无关的键-值对模式,大部分的大数据数计算引擎在底层实现上也是如此,如Spark、Tez和Storm。... 查看详情

求解最大连续子数组和问题(代码片段)

...个元素,且算法时间复杂度至少O(n).首先我们想到就是:计算所有子数组的和进行比较取最大值,该方式叫做暴力求解,如果在数据规模很小的情况下我们就可以很轻松的接触结果,但一旦规模稍微大一些,其性能就及其低了。... 查看详情

算法与并行计算常规

利用并行计算机实现软件和硬件上的并行算法的主要步骤和层次第5层是指应用层,在这一层里描述的是需要并行计算平台实现的应用和问题。对应所需的输入和输出的格式也在这层进行定义。某些输入和输出(I/O)接口的描述... 查看详情

区块链实现之pow分析(代码片段)

...要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。PoW算法思路通过不断对结点的数据进行哈希计算,通过比较目标哈希与当前哈希值的对比,实现共识算法。代码与实现思路伪码思路:1.建... 查看详情

如何高效学习和工作(撸代码)

...、如何高效地学习IT技能?在线课堂学习方式:三个一:思路一致、注意力一致、代码一致听课方式:“三个注意”:概念、场景、优缺点。 线下自我学习方式:源码学习法:三个注意:分析源码思路、提取理论知识点和跟... 查看详情

计算机网络重点知识

1、计算机网络体系结构1.1网络协议是什么?网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送... 查看详情

功能包如何工作?

...向量表示图像,这些是实现BoF的步骤:对于每个图像i,计算关键点集,并从中计算描述符集i-D。将所 查看详情

关键词匹配优化(第0篇)——问题和思路(代码片段)

...这部分进行优化,用nlp中的tf-idf方法进行关键词相似度的计算。整个流程大致是:在数据库中建立关键词映射表,在插件启动时读取为字典,在使用时如果查询不到,就计算相似度并上传到映射表。 查看详情

Java中的HashMap实现。桶索引计算是如何工作的?

】Java中的HashMap实现。桶索引计算是如何工作的?【英文标题】:HashMapimplementationinJava.Howdoesthebucketindexcalculationwork?【发布时间】:2012-06-0809:47:28【问题描述】:我正在查看Java中HashMap的实现,但我一直卡在某个地方。indexFor函数... 查看详情

使用blinkcep实现差值聚合计算

​​使用BlinkSQL+UDAF实现差值聚合计算​​介绍了如何使用BlinkSQL+UDAF实现实时流上的差值聚合计算,后来在与@付典就业务需求和具体实现方式进行探讨时,付典提出通过​​CEP​​实现的思路和方法。本文介绍通过CEP实现实时流... 查看详情

了解动态规划算法:原理实现和优化指南

...子问题,通过找到子问题之间的递推关系,可以避免重复计算,从而大幅提高计算效率。动态规划算法通常需要满足以下条件:最优子结构:问题的最优解可以通过子问题的最优解来求得。无后效性:子问题的解一旦确定,就不... 查看详情

了解动态规划算法:原理实现和优化指南

...子问题,通过找到子问题之间的递推关系,可以避免重复计算,从而大幅提高计算效率。动态规划算法通常需要满足以下条件:最优子结构:问题的最优解可以通过子问题的最优解来求得。无后效性:子问题的解一旦确定,就不... 查看详情

java概述

何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题思路、方法和手段通过计算机能够理解的形式告诉计算... 查看详情

java给月份3月和该月1日是星期二,求该月最后一个工作日的日期如何实现

...3月份,而且知道3月1日是星期二,如何求出三月最后一个工作日是几号?工作日按周一到周五算。是的,年份月份都是需要判断的。综合以上,代码改如何实现呢?给出思路也可。参考技术A我的思路是这样的,根据你提供的信... 查看详情

华为od机试真题python实现异常的打卡记录真题+解题思路+代码(2022&2023)(代码片段)

...录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。如果出现以下两种情况,则认为打卡异常:... 查看详情

join的实现原理及优化思路

...MySQLQueryOptimizer的工作原理,学习了Query优化的基本原则和思路,理解了索引选择的技巧,这一节我们将围绕Query语句中使用非常频繁,且随时可能存在性能隐患的Join语句,继续我们的Query优化之旅。 Join的实现原理在寻找Join... 查看详情