wykorzystanie pętli w zapytaniu

0

Witam. Silnik firebird. Napisałem takie zapytanie, które aktualizuje czas pracy niektórych pracowników.

update PL_ECP_EWCP
set RZECZ_GODZINA_OD = '07:30', RZECZ_GODZINA_DO = '15:30', RZECZYWISTY_CZAS_PRACY = '08:00'
where idetatu in (222, 215, 216, 217)
and (ROK = 2020) and (GODZINA_OD <> '00:00');

A tak wygląda select po zastosowaniu tego zapytania:

screenshot-20200323085312.png

Działa ono w ten sposób, że wypełnia rzeczywisty czas pracy tych pracowników godzinami 07:30-15:30, jeśli pole "godzina od" jest różne od 0. Niestety otrzymałem informację, że to zapytanie musi być bardziej optymalne, poprzez wykorzystanie kolumny id tegoż czasu pracy (na screenie to jest pierwsza kolumna). I teraz chodzi o to, żeby napisać takie zapytanie, które również zaktualizuje czas dla tych samych pracowników i również na rok 2020, ale zrobi to np. dla tego pracownika na screenie (id etatu = 215) z wyłączeniem sobót i niedziel. Czyli pierwsza sobota w roku, to był 04.01.2020 r. i dla tego dnia id = 40565. I taka pętla by dodawała do każdego id + 7, to by wszystkie soboty w roku były załatwione. Taka sama zasada dotyczy niedziel; id = 40566. Z góry dzięki za pomoc

2

źle się do tego zabierasz. Po pierwsze nie masz żadnej gwarancji, że ID w obrębie tygodnia/miesiąca/roku/całości będą po kolei i bez dziur. Po drugie FB ma funkcje, które zwracają dzień tygodnia z daty http://www.janus-software.com/fbmanual/manual.php?book=PSQL&topic=50

0
abrakadaber napisał(a):

źle się do tego zabierasz.

Na pewno masz rację, ale gdybym mimo wszystko się uparł, to pokażesz mi jak to zrobić, tak jak napisałem?

Po pierwsze nie masz żadnej gwarancji, że ID w obrębie tygodnia/miesiąca/roku/całości będą po kolei i bez dziur.

Id jest na pewno unikatowe, bo jest założone ograniczenie na nie, że musi być unikatowe. Także jest po kolei. Dziur też raczej nie ma, bo rośnięcie id odbywa się w ramach etatu danego pracownika. Poniżej zrzut z wszystkich kolumn tej tabeli.

screenshot-20200323101626.png

Po drugie FB ma funkcje, które zwracają dzień tygodnia z daty http://www.janus-software.com/fbmanual/manual.php?book=PSQL&topic=50

To twoje zapytanie zapisałem tak:

select
DECLARE DoW AS INTEGER;
BEGIN
DoW = EXTRACT(WEEKDAY FROM DATA)
END
from PL_ECP_EWCP;

Ale wyrzuca mi tak błąd, jak poniżej. Nie wiem, co źle robię.
screenshot-20200323102403.png

0

Hej. Zrobiłem to tak. Wstawiłem takie zapytanie:

select data,
extract (weekday from data) as dzien_tygodnia
from PL_ECP_EWCP
where idetatu in (222, 215, 216, 217)
and (ROK = 2020);

I mam takie wyniki:

screenshot-20200323123129.png

Teraz pytanie, jak złączyć oba zapytania, żeby zrobić takiego update'a, żeby mi zaktualizował dane z wyjątkiem tych dni, oznaczonych jako "0" i "6" w tym ostatnim zapytaniu. Czy trzeba dodać fizycznie kolumnę w tej tabeli, czy wystarczy zrobić jakieś joina?

2

serio???

update PL_ECP_EWCP
set RZECZ_GODZINA_OD = '07:30', RZECZ_GODZINA_DO = '15:30', RZECZYWISTY_CZAS_PRACY = '08:00'
where idetatu in (222, 215, 216, 217)
and (ROK = 2020) and (GODZINA_OD <> '00:00')
and extract (weekday from data) between 1 and 5;
0
abrakadaber napisał(a):

serio???

update PL_ECP_EWCP
set RZECZ_GODZINA_OD = '07:30', RZECZ_GODZINA_DO = '15:30', RZECZYWISTY_CZAS_PRACY = '08:00'
where idetatu in (222, 215, 216, 217)
and (ROK = 2020) and (GODZINA_OD <> '00:00')
and extract (weekday from data) between 1 and 5;

Dzięki takie zapytanie rzeczywiście działa. Ale umiałbyś jeszcze zrobić taki zapytaniem, uzależnionym od id?

0

ale zapytanie z ID NIE MA SENSU. Jeśli jednak bardzo chcesz to

update PL_ECP_EWCP
set RZECZ_GODZINA_OD = '07:30', RZECZ_GODZINA_DO = '15:30', RZECZYWISTY_CZAS_PRACY = '08:00'
where idetatu in (222, 215, 216, 217)
and (ROK = 2020) and (GODZINA_OD <> '00:00')
and not mod(id, 7) in (mod((select id from PL_ECP_EWCP where data = '04.01.2020'), 7), mod((select id from PL_ECP_EWCP where data = dateadd(1 day to '04.01.2020')), 7)) ;

o ile nie pomyliłem się gdzieś w nawiasach

0
abrakadaber napisał(a):

o ile nie pomyliłem się gdzieś w nawiasach

W nawiasach się nie pomyliłeś, ale firebird wyrzuca taki błąd:

screenshot-20200324113156.png

Pewnie, w którymś miejscu zapytania jest jakiś dubel. Ciekawi mnie jeszcze czy to twoje zapytanie będzie sprawdzało czy id jest różne od reszty z dzielenia podanego id dla podanych numerów etatów, czy będzie sprawdzało wszystkie id? Bo jeśli to drugie, to faktycznie trochę to bez sensu, bo dla wszystkich etatów z bazy, reszta z dzielenia z id dla daty 04.01.2020 r. będzie różna.

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