sql按时间取去重最近_mssql sqlserver 获取指定日期为本月第几个工作日

本文介绍如何在SQL中计算指定日期在当月的第几个工作日,包括处理法定假日和周末调班的情况。通过创建日期流水表并排除周末和假日,最终找到目标日期的工作日位置。
摘要由CSDN通过智能技术生成

摘要:

下文讲述工作中,需要获取指定日期在当月的工作日

下文讲述常规的指定工作日所在月的天数分析,

实现思路:

1 生成一个国家法定假日表(A),非星期六,星期天

2 生成一个国家法定补办表(B),涉及星期六星期天调班

3 生成指定月份的日期流水表(C)

4 获取指定日期的工作日信息,如下所示:

--例: 获取 2018-4-10 为2018年4月的第几个工作日

declare @d datetime

set @d ='2018-4-10' --可通过下面的方法计算出 为本月第6个工作日

---1:获取4月指定日期的所在月工作日数

create table A(A datetime)

create table B(B datetime)

----4.5.4.6 4.7 4.30为法定假日

insert into A (A)values('2018-4-5'),

('2018-4-6'),('2018-4-7'),('2018-4-30')

----补班日 4月8 4月28 4月30 日

insert into B (B)values('2018-4-8'),

('2018-4-28'),('2018-4-30')

---生成指定月份(4月)所有天数流水

set datefirst 1 --设置星期一为第一个工作日

select * from

(

select row_number() over(order by d asc ) as [本月第*个工作日],d,datepart(w,d) as [weekInfo] from (

select dateadd(day,number,'2018-4-1') as d from master..spt_values

where type='p'

and number >=0

and dateadd(day,number,'2018-4-1') between '2018-4-1' and dateadd(day,-1,'2018-5-1')

) as a

where a.d not in (select A from A)

and (a.d in (select b from B )

or datepart(w,a.d) not in (6,7)

)

) as extend

where d =@d

go

drop table A

drop table B

mssql_sqlserver_指定日期所属月份工作日获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值