加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

根据时间段计算工作日的天数(SqlServer),包含节假日的处理

发布时间:2020-12-12 13:34:27 所属栏目:MsSql教程 来源:网络整理
导读:创建节假日表: USE [XHManage] GO /****** Object:? Table [dbo].[Holiday]??? Script Date: 02/20/2014 17:51:54 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Holiday]( ?[Id] [int] IDENTITY(1,1) NOT NULL, ?[Name] [

创建节假日表:

USE [XHManage]
GO

/****** Object:? Table [dbo].[Holiday]??? Script Date: 02/20/2014 17:51:54 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Holiday](
?[Id] [int] IDENTITY(1,1) NOT NULL,
?[Name] [nvarchar](50) NOT NULL,
?[BeginDate] [datetime] NOT NULL,
?[EndDate] [datetime] NOT NULL,
?[AddUser] [nvarchar](50) NOT NULL,
?[AddTime] [datetime] NOT NULL,
?[Exchange] [bit] NOT NULL,
?CONSTRAINT [PK_Holiday] PRIMARY KEY CLUSTERED
(
?[Id] ASC
)WITH (PAD_INDEX? = OFF,STATISTICS_NORECOMPUTE? = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS? = ON,ALLOW_PAGE_LOCKS? = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Holiday] ADD? CONSTRAINT [DF_Holiday_AddTime]? DEFAULT (getdate()) FOR [AddTime]
GO

ALTER TABLE [dbo].[Holiday] ADD? CONSTRAINT [DF_Holiday_Exchange]? DEFAULT ((0)) FOR [Exchange]
GO

?输入数据(2014年国家节假日设置数据):

INSERT INTO [XHManage].[dbo].[Holiday]([Name],[BeginDate],[EndDate],[AddUser],[AddTime],[Exchange])VALUES('元旦','2014-1-1','admin','2014-2-20',1)
INSERT INTO [XHManage].[dbo].[Holiday]([Name],[Exchange])VALUES('春节','2014-1-31','2014-2-6',[Exchange])VALUES('清明节','2014-4-5','2014-4-7',[Exchange])VALUES('劳动节','2014-5-1','2014-5-3',[Exchange])VALUES('端午节','2014-6-2',[Exchange])VALUES('中秋节','2014-9-8',[Exchange])VALUES('国庆节','2014-10-1','2014-10-7',[Exchange])VALUES('春节调休','2014-1-26','2014-2-8',[Exchange])VALUES('劳动节调休','2014-5-4',[Exchange])VALUES('国庆节调休','2014-9-28','2014-10-11',1)

?

?

?

go
create function [dbo].[WorkDay]
(
@beginday?? datetime,
@endday?? datetime
)
returns int
?AS
begin
? --set?? datefirst?? 1
? declare? @caldays?? int??
? declare? @id?? int
? select?? @caldays=0
?
? while? DATEDIFF(d,@beginday,@endday)>=0
????? begin
?????????????
????????? if? datepart(dw,@beginday)>1 and datepart(dw,@beginday)<7
???? begin
???SELECT @id=count(*) from Holiday
???where @beginday between begindate and DATEADD(s,-1,DATEADD(day,1,enddate)) and [Exchange]=0
???if(@id=0)??
??? select?? @caldays=@caldays+1
???? end
???? else
???? begin
???? SELECT @id=count(*) from Holiday
???? where @beginday between begindate and DATEADD(s,enddate)) and [Exchange]=1
???if(@id>0)
??? select?? @caldays=@caldays+1
???? end
???? select?? @beginday=dateadd(day,@beginday)
????? end??
return?? @caldays
end

测试:

go select dbo.[WorkDay]('2014-10-1','2014-10-31')as '工作日' select dbo.[WorkDay]('2014-9-1','2014-9-30')as '工作日' select dbo.[WorkDay]('2014-9-30','2014-9-30')as '工作日' select dbo.[WorkDay]('2014-6-1','2014-6-30')as '工作日'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读