ďťż
 
[PostgreSQL] Liczba dni roboczych miedzy dwoma datami ďťż
 
[PostgreSQL] Liczba dni roboczych miedzy dwoma datami
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • bajkomoda.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com