項目中目前已有一周表存儲了一年中所有的假日,給定查詢起始日期和結束日期,推導出查詢時間段內工作日是多少。為了簡化這個問題,需要下面幾個假設。 1. 不考慮周六周日,將其視作普通工作日 2. 假日沒有交疊情況,不會出現10月1日到7日是國慶節(jié),其中又有
項目中目前已有一周表存儲了一年中所有的假日,給定查詢起始日期和結束日期,推導出查詢時間段內工作日是多少。為了簡化這個問題,需要下面幾個假設。
1. 不考慮周六周日,將其視作普通工作日
2. 假日沒有交疊情況,不會出現10月1日到7日是國慶節(jié),其中又有一個其它的節(jié)日
給出假日表的設計,某個假日都有起始時間和結束時間,這里只取月日,這樣就能表示每一年的假日。
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
1. 查詢時間為2014-10-05至2014-10-08
結果:1
2. 查詢時間為2014-09-30至2014-10-07
結果:1
3. 增加一條假日,例如是教師節(jié),查詢時間段為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