MS SQL pętle z działaniem na datach

0

Witam,

Piszę trigera w MS SQL, który będzie odejmował od daty realizacji 1 dzień. Jednak dodatkowo ma się odbywać sprawdzanie czy po odjęciu 1 dnia nie wypada sobota lub niedziela. Jeżeli wypada sobota to odejmuje 1 dzień, jeżeli niedziela odejmuje 2 dni. Następnie sprawdza czy ten dzień nie wypada w święto. Jeżeli tak to znowu odejmuje 1 dzień. Święta są zapisane w tabeli. Daty w bazie są zapisane jako unixtime.

Mam już napisane warunki, ale nie mogę poradzić sobie z pętlami. Np. ustawiłem w aplikacji, że święto jest 3 i 4 grudnia, a datę ustawiam na 5 grudnia. Triger odejmuje 1 dzień i robi się 4 grudnia, ale jest to zdefiniowane święto, więc odejmuje jeszcze 1 dzień i teraz mam 3 grudnia. Jest to również święto, więc powinien odjąć kolejny dzień, ale niestety tego nie robi.

Poniżej zamieszczam kod jaki napisałem do tej pory.

declare @data datetime
declare @data2 datetime
declare @data3 datetime
declare @data4 datetime
declare @day char(9)

set @data=(select convert(varchar,dateadd(s,datediff(s,GETUTCDATE() ,getdate()) + (duebytime/1000),'1970-01-01 0000'),120) from WorkOrder where WORKORDERID=582)

set @data2=(select DATEADD(day,-1,convert(varchar,dateadd(s,datediff(s,GETUTCDATE() ,getdate()) + (duebytime/1000),'1970-01-01 0000'),120)) from WorkOrder where WORKORDERID=582)

--sprawdza czy piatek czy sobota
set @day=(select DATENAME(dw,@data2))
if @day='Saturday'
begin
set @data3=(DATEADD(day,-1,@data2))
goto check_holidays
end
if @day='Sunday'
begin
set @data3=(DATEADD(day,-2,@data2))
goto check_holidays
end
else
set @data3=@data2
goto check_holidays

--sprawdza czy swieta
check_holidays:
while (CONVERT(VARCHAR(10), @data3, 126)) in (select holidaydate from HolidayDefinition)
begin
set @data4=(DATEADD(day,-1,@data3))
if (CONVERT(VARCHAR(10), @data3, 126)) not in (select holidaydate from HolidayDefinition)
set @data4=@data3
break
end

select @data 'data poczatkowa',@data2 'data -1',@data3'data po sprawdzeniu weekendu',@data4 'data po spr swiat',@day 'dzien tygodnia'

2

Dlaczego tak utrudniasz sobie życie? :)

declare @data datetime = (select DATEADD(day,-1,convert(varchar,dateadd(s,datediff(s,GETUTCDATE() ,getdate()) + (duebytime/1000),'1970-01-01 00:00:00'),120)) from WorkOrder where WORKORDERID=582)

SELECT @data 'Data początkowa'

WHILE ((DATENAME(dw,@data)=DATENAME(dw,6)) OR (DATENAME(dw,@data)=DATENAME(dw,5)) OR (CONVERT(VARCHAR(10), @data, 126) in (select holidaydate from HolidayDefinition)))
  SET @data=DATEADD(day,-1,@data)

select @data 'data koncowa', DATENAME(dw,@data) 'dzien tygodnia'
0

Hmmm zawsze wiedziałem, że największe problemy są najprostsze do rozwiązania, ale nie myślałem że aż tak. Dzięki, sprawdzę Twoje rozwiązanie.

EDIT: działa wspaniale. Jeszcze raz dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1