ALTER function [dbo].[DateAddWorkDay]
(@days int,@FromDate Date)
returns Date
as
begin
declare @result date
set @result = (
select b
from
(
SELECT
b,
(DATEDIFF(dd, a, b))
-(DATEDIFF(wk, a, b) * 2)
-(CASE WHEN DATENAME(dw, a) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, b) = 'Saturday' THEN 1 ELSE 0 END)
-COUNT(o.Holiday)
as workday
from
(
select
@FromDate as a,
dateadd(DAY,num +@days,@FromDate) as b
from (select row_number() over (order by (select NULL)) as num
from Information_Schema.columns
) t
where num <= 100
) dt
left join Holiday o on o.Holiday between a and b and DATENAME(dw, o.Holiday) not in('Saturday','Sunday')
where DATENAME(dw, b) not in('Saturday','Sunday')
and b not in (select Holiday from Holiday where Holiday between a and b)
group by a,b
) du
where workday =@days
)
return @result
end
dateadd(DAY,-num +@days,@FromDate)
todateadd(DAY,case when num > 0 then num +@days else -num+@days end,@FromDate)
o.Holiday between a and b
to ((@days > 0 AND o.Holiday BETWEEN a and b) OR (@days < 0 and o.Holiday between b and a))
to get the records fetched out..ASKER
ALTER function [dbo].[DateAddWorkDay]
(@days int,@FromDate Date)
returns Date
as
begin
declare @result date
set @result = (
select b
from
(
SELECT
b,
(DATEDIFF(dd, a, b))
-(DATEDIFF(wk, a, b) * 2)
-(CASE WHEN DATENAME(dw, a) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, b) = 'Saturday' THEN 1 ELSE 0 END)
-COUNT(o.Holiday)
as workday
from
(
select
@FromDate as a,
dateadd(DAY,case when num > 0 then num +@days else -num+@days end,@FromDate) as b
from (select row_number() over (order by (select NULL)) as num
from Information_Schema.columns
) t
where num <= 100
) dt
left join Holiday o on
((@days > 0 AND o.Holiday BETWEEN a and b) OR (@days < 0 and o.Holiday between b and a))
AND DATENAME(dw, o.Holiday) not in('Saturday','Sunday')
where DATENAME(dw, b) not in('Saturday','Sunday')
and b not in (select Holiday from Holiday where Holiday between a and b)
group by a,b
) du
where workday =@days
)
return @result
end
CREATE TABLE [dbo].[Holiday](
[Holiday] [date] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-01-01' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-01-01' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-09-03' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-11-22' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-11-23' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-12-25' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-12-26' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-12-27' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-12-28' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2018-12-31' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-01-01' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-05-27' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-07-04' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-09-02' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-11-28' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-11-29' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-12-25' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-12-26' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-12-27' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-12-30' AS Date))
GO
INSERT [dbo].[Holiday] ([Holiday]) VALUES (CAST(N'2019-12-31' AS Date))
GO
ASKER
Microsoft SQL Server is a suite of relational database management system (RDBMS) products providing multi-user database access functionality.SQL Server is available in multiple versions, typically identified by release year, and versions are subdivided into editions to distinguish between product functionality. Component services include integration (SSIS), reporting (SSRS), analysis (SSAS), data quality, master data, T-SQL and performance tuning.
TRUSTED BY
you already have this:
Open in new window
it should worked if @days is negative too