[PostgreSQL] Liczba dni roboczych miedzy dwoma datami
Rafal M - 03-01-2006 10:29
[PostgreSQL] Liczba dni roboczych miedzy dwoma datami
Witam, Naliczanie za 1h pracy, w osobnej tabeli znajduja sie dni wolne dla kazdego zawodu/stanowiska Dzisiaj albo jutro bede to testowal, zgodnie z prosba jednego z grupowiczow, zamieszczam kod Mozna to jeszcze ulepszyc, ale na razie wystarczy tyle...
CREATE OR REPLACE FUNCTION "public"."f_czas_pracy" (data_od timestamp, data_do timestamp) RETURNS integer AS $body$ declare czas_pracy integer; begin czas_pracy := extract(hour from data_do) - extract(hour from data_od); if czas_pracy <= 0 then czas_pracy := 24 + czas_pracy; end if; return czas_pracy; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE OR REPLACE FUNCTION "public"."f_czas_pracy_tyd" (dzien smallint, temp1 "public"."t_czas_pracy_tyd") RETURNS integer AS $body$ declare czas_pracy integer; begin czas_pracy := 0; if dzien = 0 and temp1.niedziela then /*niedziela*/ czas_pracy := f_czas_pracy(temp1.data_niedziela_od, temp1.data_niedziela_do); elsif dzien = 1 and temp1.poniedzialek then /*poniedzialek*/ czas_pracy := f_czas_pracy(temp1.data_poniedzialek_od, temp1.data_poniedzialek_do); elsif dzien = 2 and temp1.wtorek then /*wtorek*/ czas_pracy := f_czas_pracy(temp1.data_wtorek_od, temp1.data_wtorek_do); elsif dzien = 3 and temp1.sroda then /*sroda*/ czas_pracy := f_czas_pracy(temp1.data_sroda_od, temp1.data_sroda_do); elsif dzien = 4 and temp1.czwartek then czas_pracy := f_czas_pracy(temp1.data_czwartek_od, temp1.data_czwartek_do); elsif dzien = 5 and temp1.piatek then czas_pracy := f_czas_pracy(temp1.data_piatek_od, temp1.data_piatek_do); elsif dzien = 6 and temp1.sobota then czas_pracy := f_czas_pracy(temp1.data_sobota_od, temp1.data_sobota_do); end if; return czas_pracy; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE OR REPLACE FUNCTION "public"."f_czy_dzien_wolny" (data date, id_zawody integer) RETURNS boolean AS $body$ declare curs_dni_wolne refcursor; r_dni_wolne record; data1 date; begin open curs_dni_wolne for select * from sl_dniwolne where idzawody = id_zawody; loop fetch curs_dni_wolne into r_dni_wolne; exit when not found; if r_dni_wolne.wszystkie_lata then if f_miesiac_dzien(data) >= f_miesiac_dzien(r_dni_wolne.data_od) and f_miesiac_dzien(data) <= f_miesiac_dzien(r_dni_wolne.data_do) then close curs_dni_wolne; return true; end if; else data1 := date_trunc('day', data); if data1 >= date_trunc('day', r_dni_wolne.data_od) and data1 <= date_trunc('day', r_dni_wolne.data_do) then close curs_dni_wolne; return true; end if; end if; end loop; close curs_dni_wolne; return false; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE OR REPLACE FUNCTION "public"."f_dzien_odpracowania" (data timestamp, id_zawody integer) RETURNS date AS $body$ declare curs_dni_wolne refcursor; r_dni_wolne record; data1 date; begin open curs_dni_wolne for select * from sl_dniwolne where idzawody = id_zawody; loop fetch curs_dni_wolne into r_dni_wolne; exit when not found; if r_dni_wolne.wszystkie_lata then if f_miesiac_dzien(data) = f_miesiac_dzien(r_dni_wolne.data_odpracowania) then close curs_dni_wolne; return r_dni_wolne.data_od; end if; else data1 := date_trunc('day', data); if data1 = date_trunc('day', r_dni_wolne.data_odpracowania) then close curs_dni_wolne; return r_dni_wolne.data_od; end if; end if;
end loop; close curs_dni_wolne; return null; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE OR REPLACE FUNCTION "public"."f_miesiac_dzien" (data timestamp) RETURNS date AS $body$ declare result date; r varchar; begin r := '0001-' || extract(month from data); r := r || '-' || extract(day from data); result := r; return result; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE OR REPLACE FUNCTION "public"."f_sum_nieobecnosci" (idpracownicy integer, data_od timestamp, data_do timestamp) RETURNS integer [] AS $body$ declare temp1 record; t1 t_czas_pracy_tyd; r_dni_wolne record; curs_dni_wolne refcursor; curs1 cursor is select * from pracownicy_umowyoprace join pracownicy_nieobecnosci on (pracownicy_umowyoprace.idpracownicy = pracownicy_nieobecnosci.idpracownicy and pracownicy_umowyoprace.idpracownicy = idpracownicy and data_od <= data_do AND pracownicy_nieobecnosci.data_od <= pracownicy_nieobecnosci.data_do and pracownicy_nieobecnosci.data_od <= data_do and pracownicy_nieobecnosci.data_do >= data_od and pracownicy_nieobecnosci.data_od <= pracownicy_umowyoprace.data_zakonczenia and pracownicy_nieobecnosci.data_do >= pracownicy_umowyoprace.data_rozpoczecia); _od timestamp; _do timestamp; od1 timestamp; do1 timestamp; data date; czas_pracy integer; dzien smallint; i1 interval; i integer; od1_day_of_week integer; liczba_dni integer; result integer[]; tyg integer; dni integer; j integer; iv1 interval; dodaj integer; kwota_zp real; kwota_zus real; s varchar; d date;
begin liczba_dni := 0; kwota_zp := 0; kwota_zus :=0; open curs1; loop fetch curs1 into temp1; exit when not found;
if temp1.data_rozpoczecia > data_od then _od := temp1.data_rozpoczecia; else _od := data_od; end if; if temp1.data_zakonczenia > data_do then _do := data_do; else _do := temp1.data_zakonczenia; end if;
if temp1.data_od > _od then od1 := temp1.data_od; else od1 := _od; end if; if temp1.data_do > _do then do1 := _do; else do1 := temp1.data_do; end if; i1 := do1 - od1; i := extract(day from i1) + 1; od1_day_of_week := extract(dow from od1); for j in 1..i loop s := j - 1 || ' days'; iv1 := s; data := od1 + iv1; dzien := extract(dow from data); czas_pracy := 0;
t1.niedziela := temp1.niedziela; t1.data_niedziela_od := temp1.data_niedziela_od; t1.data_niedziela_do := temp1.data_niedziela_do; t1.poniedzialek := temp1.poniedzialek; t1.data_poniedzialek_od := temp1.data_poniedzialek_od; t1.data_poniedzialek_do := temp1.data_poniedzialek_do; t1.wtorek := temp1.wtorek; t1.data_wtorek_od := temp1.data_wtorek_od; t1.data_wtorek_do := temp1.data_wtorek_do; t1.sroda := temp1.sroda; t1.data_sroda_od := temp1.data_sroda_od; t1.data_sroda_do := temp1.data_sroda_do; t1.czwartek := temp1.czwartek; t1.data_czwartek_od := temp1.data_czwartek_od; t1.data_czwartek_do := temp1.data_czwartek_do; t1.piatek := temp1.piatek; t1.data_piatek_od := temp1.data_piatek_od; t1.data_piatek_do := temp1.data_piatek_do; t1.sobota := temp1.sobota; t1.data_sobota_od := temp1.data_sobota_od; t1.data_sobota_do := temp1.data_sobota_do;
if not f_czy_dzien_wolny(data, temp1.idzawody) then czas_pracy := f_czas_pracy_tyd(dzien, t1); end if; d := f_dzien_odpracowania(data, temp1.idzawody); if s is not null then dzien := extract(dow from d); czas_pracy := czas_pracy + f_czas_pracy_tyd(dzien, t1); end if; kwota_zp := kwota_zp + czas_pracy * temp1.wynagrodzeniewyplacanezesrodkowzakladupracy; kwota_zus := kwota_zus + czas_pracy * temp1.wynagrodzeniewyplacanezesrodkowzus; end loop;
end loop; close curs1; result[1] := kwota_zp; result[2] := kwota_zus; return result; end; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
szaman - 03-01-2006 10:29
A niby takie trywialne zadanko a ile się trzeba napisać. -- {67B14976-ABB4-4A3B-869B-84B5CCA1F569}
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
zanotowane.pldoc.pisz.plpdf.pisz.plbajkomoda.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|