Dobry wieczór.
Mam taska gdzie muszę znaleźć trzeci dzień roboczy od daty utworzenia akcji. Dzień utworzenia akcji jest DNIEM ZEROWYM.
Jedyne co udało mi się wymyślić to:
1)
Case
when DATEPART(weekday,GETDATE())=1
then dateadd(dd,3,a.DataDodania)
when DATEPART(weekday,GETDATE())=2
then dateadd(dd,4,a.DataDodania)
when DATEPART(weekday,GETDATE())=3
then dateadd(dd,4,a.DataDodania)
when DATEPART(weekday,GETDATE())=4
then dateadd(dd,5,a.DataDodania)
when DATEPART(weekday,GETDATE())=5
then dateadd(dd,6,a.DataDodania)
when DATEPART(weekday,GETDATE())=6
then dateadd(dd,5,a.DataDodania)
else
dateadd(dd,4,a.DataDodania)
end [termin]
*a.DataDodania+[WorkingDays] (a.DataDodania,a.dataDodania+3)*****
Niestety ale oba moje wymysły nie działają prawidłowo. Poniżej dołączam skrypt "ogólnodostępnych funkcji" które wykorzystuję. [WorkingDays] i [GetHolidays]
ALTER function [GetHolidays](@year int)
returns @Dates table (HolidayDate date, HolidayName nvarchar(100))
as begin
declare @Easter date
set @Easter = [GetEaster](@year)
insert into @Dates values
(DATEFROMPARTS(@year, 1, 1), 'Nowy Rok'),
(DATEFROMPARTS(@year, 1, 6), 'Trzech Króli (Objawienie Pańskie)'),
(@Easter, 'Wielkanoc'),
(dateadd(day, 1, @Easter), 'Poniedziałek Wielkanocny'),
(DATEFROMPARTS(@year, 5, 1), 'Międzynarodowe Święto Pracy'),
(DATEFROMPARTS(@year, 5, 3), 'Święto Konstytucji 3 Maja'),
(dateadd(day, 60, @Easter), 'Boże Ciało'),
(DATEFROMPARTS(@year, 8, 15), 'Święto Wojska Polskiego, Wniebowzięcie Najświętszej Maryi Panny'),
(DATEFROMPARTS(@year, 11, 1), 'Wszystkich Świętych'),
(DATEFROMPARTS(@year, 11, 11), 'Narodowe święto Niepodległości'),
(DATEFROMPARTS(@year, 12, 25), 'Boże Narodzenie (pierwszy dzień)'),
(DATEFROMPARTS(@year, 12, 26), 'Boże Narodzenie (drugi dzień)')
return
end
--------------------------
ALTER FUNCTION [WorkingDays] ( @StartDate datetime, @EndDate datetime)
RETURNS int
AS BEGIN
DECLARE @days int
DECLARE @SatName nvarchar(100),@SunName nvarchar(100)
SELECT @SatName = DATENAME(dw,5), @SunName = DATENAME(dw,6)
SELECT @days = (DATEDIFF(d,@StartDate ,@EndDate )+1) - DATEDIFF(wk,@StartDate ,@EndDate ) * 2
-(CASE WHEN DATENAME(dw, @StartDate) = @SunName THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @EndDate) = @SatName THEN 1 ELSE 0 END)
- (SELECT COUNT(*) FROM GetHolidays(year(@StartDate))
WHERE HolidayDate BETWEEN @StartDate AND @EndDate AND DATENAME(dw, HolidayDate) <> @SatName
AND DATENAME(dw, HolidayDate) <> @SunName) RETURN (@days)