MS SQL pętle z działaniem na datach

MS SQL pętle z działaniem na datach
soczipres
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:5
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 00:00:00'),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 00:00:00'),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'

edytowany 1x, ostatnio: soczipres
Vardamir
Może tagi? :(
Vardamir
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Wrocław
2

Dlaczego tak utrudniasz sobie życie? :)

Kopiuj
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'

"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf
edytowany 1x, ostatnio: Vardamir
soczipres
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:5
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.

edytowany 1x, ostatnio: soczipres

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.