Nie chce przyjąć funkcji 
– Dodane 22.11.2011 (Wt) 9:49 –
…P…K
…|#####################|
…|xxxxxxxxxxxxxxxx| - P jest między data_od i data_do
…|xxxxxxxxxxxxx| - K jest między data_od i data_do
…|xxxxxxxxxxxx| - data_od jest między P i K
Z moich spostrzeżeń wynika, że wystarczy sprawdzić 3 warunki zamiast funkcji.
– Dodane 22.11.2011 (Wt) 13:43 –
SELECT t2.id_osoby, t2.data_okr, t2.kwota, t3.data_od, t3.data_do
FROM table2 as t2, table3 as t3
WHERE t2.id_osoby = t3.id_osoby AND NOT EXISTS (
SELECT temp.data_okr
FROM table2 as temp
WHERE (t2.data_okr BETWEEN t3.data_od AND t3.data_do
OR ((t2.data_okr)::date + interval '1 month' - interval '1 day') BETWEEN t3.data_od AND t3.data_do
OR t3.data_od BETWEEN t2.data_okr AND ((t2.data_okr)::date + interval '1 month' - interval '1 day'))
)
/*
SELECT t1.Imie, t1.Nazwisko, temp.data_okr, temp.kwota
FROM table1 AS t1, (
SELECT t2.id_osoby, t2.data_okr, t2.kwota
FROM table2 as t2 LEFT JOIN table3 as t3 ON t2.id_osoby = t3.id_osoby
WHERE t3.id_osoby IS NULL
UNION ALL
SELECT t2.id_osoby, t2.data_okr, t2.kwota
FROM table2 as t2, table3 as t3
WHERE t2.id_osoby = t3.id_osoby AND NOT EXISTS (
SELECT temp.data_okr
FROM table2 as temp
WHERE (t2.data_okr BETWEEN t3.data_od AND t3.data_do
OR ((t2.data_okr)::date + interval '1 month' - interval '1 day') BETWEEN t3.data_od AND t3.data_do
OR t3.data_od BETWEEN t2.data_okr AND ((t2.data_okr)::date + interval '1 month' - interval '1 day'))
)
) as temp
WHERE t1.id_osoby = temp.id_osoby
and temp.kwota > 0
SELECT t1.Imie, t1.Nazwisko, t2.data_okr, t2.kwota, t3.data_od, t3.data_do
FROM table1 AS t1
JOIN table2 as t2 ON t1.id_osoby = t2.id_osoby
Left JOIN table3 as t3 ON t3.id_osoby = t2.id_osoby
"Jan ";"Kowalski ";"2008-01-01";30.00;"2008-01-31";"2008-03-01"
"Jan ";"Kowalski ";"2008-01-01";30.00;"2008-05-05";"2008-05-10"
"Jan ";"Kowalski ";"2008-02-01";30.00;"2008-01-31";"2008-03-01"
"Jan ";"Kowalski ";"2008-02-01";30.00;"2008-05-05";"2008-05-10"
"Jan ";"Kowalski ";"2008-03-01";30.00;"2008-01-31";"2008-03-01"
"Jan ";"Kowalski ";"2008-03-01";30.00;"2008-05-05";"2008-05-10"
"Jan ";"Kowalski ";"2008-04-01";30.00;"2008-01-31";"2008-03-01"
"Jan ";"Kowalski ";"2008-04-01";30.00;"2008-05-05";"2008-05-10"
"Jan ";"Kowalski ";"2008-05-01";30.00;"2008-01-31";"2008-03-01"
"Jan ";"Kowalski ";"2008-05-01";30.00;"2008-05-05";"2008-05-10"
"Jan ";"Nowak ";"2008-05-01";30.00;"";""
"Edward ";"Wiśniewski ";"2008-08-01";0.00;"";""
"Agnieszka ";"Kowalska ";"2008-09-01";30.00;"2008-08-01";"2009-09-03"
DROP TABLE std.Table1;
DROP TABLE std.Table2;
DROP TABLE std.Table3;
CREATE TABLE std.Table1
(
id_osoby integer,
imie character(15),
nazwisko character(15)
)
WITH (OIDS=FALSE);
ALTER TABLE std.Table1 OWNER TO only_select;
CREATE TABLE std.Table2
(
id_osoby integer,
data_okr date,
kwota numeric(9,2)
)
WITH (OIDS=FALSE);
ALTER TABLE std.Table2 OWNER TO only_select;
CREATE TABLE std.Table3
(
id_osoby integer,
data_od date,
data_do date
)
WITH (OIDS=FALSE);
ALTER TABLE std.Table3 OWNER TO only_select;
--------
INSERT INTO Table1 VALUES ('1', 'Jan', 'Kowalski');
INSERT INTO Table1 VALUES ('2', 'Jan', 'Nowak');
INSERT INTO Table1 VALUES ('3', 'Edward', 'Wiśniewski');
INSERT INTO Table1 VALUES ('4', 'Agnieszka', 'Kowalska');
--------
INSERT INTO Table2 VALUES ('1', '2008-01-01', 30.00);
INSERT INTO Table2 VALUES ('1', '2008-02-01', 30.00);
INSERT INTO Table2 VALUES ('1', '2008-03-01', 30.00);
INSERT INTO Table2 VALUES ('1', '2008-04-01', 30.00);
INSERT INTO Table2 VALUES ('1', '2008-05-01', 30.00);
INSERT INTO Table2 VALUES ('2', '2008-05-01', 30.00);
INSERT INTO Table2 VALUES ('3', '2008-08-01', 0.00);
INSERT INTO Table2 VALUES ('4', '2008-09-01', 30.00);
--------
INSERT INTO Table3 VALUES ('1', '2008-01-31', '2008-03-01');
INSERT INTO Table3 VALUES ('1', '2008-05-05', '2008-05-10');
INSERT INTO Table3 VALUES ('4', '2008-08-01', '2009-09-03');
*/
Jest problem jak w tabeli 3 są dwa okresy dla jednej osoby.