Всем доброго времени суток.
Если вы не против перейду сразу к сути дела. У меня есть некая база данных (Аренда земельных участков) и появилась такая задача, что надо вывести участки, которые арендуются одновременно по нескольким делам. И теперь я не знаю, как вывести из одной таблицы, там где есть дата начала аренды, значения, которые могут пересекаться по дате аренды (то есть когда одна дата частично или полностью покрывает другую). Если у кого-нибудь есть какие-нибудь идеи или предложения, то я внимательно слушаю
Это схема данных, но тут нужны только 2 таблицы: Аренда и Участки.
Arenda........... Arendatori
N_dela*.......... id_ara*
id_uch......... Fam
id_ara......... Name
cost_month........ Otch
kol_month......... org_ara
id_sotr.......... telephon
data_begin........ address
Arendodateli........... Uchastki
id_ala*......... id_uch*
Org ......... kol_m
Telephon_work ........ address
Fax .......... id_ala
Address............
А это код при создании БД:
CREATE DATABASE ARENDA TEMPLATE template0 ENCODING='WIN1251' lc_collate 'C' lc_ctype 'C'; CREATE TABLE ARENDODATELI ( ID_ALA INTEGER PRIMARY KEY, ORG TEXT NOT NULL UNIQUE, TELEPHON_WORK CHAR(11) NOT NULL UNIQUE, FAX CHAR(10) UNIQUE, ADDRESS TEXT NOT NULL UNIQUE); CREATE TABLE UCHASTKI ( ID_UCH INTEGER PRIMARY KEY, KOL_M INTEGER NOT NULL CHECK (KOL_M > 10), ADDRESS TEXT NOT NULL UNIQUE, ID_ALA INTEGER NOT NULL REFERENCES ARENDODATELI ON DELETE NO ACTION ON UPDATE CASCADE); CREATE TABLE ARENDATORI ( ID_ARA INTEGER PRIMARY KEY, FAM TEXT NOT NULL, NAME TEXT NOT NULL, OTCH TEXT NOT NULL, ORG_ARA TEXT, TELEPHON CHAR(11) NOT NULL UNIQUE, ADDRESS TEXT NOT NULL); CREATE TABLE SOTRUDNIKI ( ID_SOTR INTEGER PRIMARY KEY, FAM TEXT NOT NULL, NAME TEXT NOT NULL, OTCH TEXT NOT NULL, TELEPHON CHAR(11) NOT NULL UNIQUE); CREATE TABLE ARENDA ( N_DELA INTEGER PRIMARY KEY, ID_UCH INTEGER NOT NULL REFERENCES UCHASTKI ON DELETE NO ACTION ON UPDATE CASCADE, ID_ARA INTEGER NOT NULL REFERENCES ARENDATORI ON DELETE NO ACTION ON UPDATE CASCADE, COST_MONTH INTEGER NOT NULL CHECK (COST_MONTH > 0), KOL_MONTH INTEGER NOT NULL CHECK (KOL_MONTH>=1), ID_SOTR INTEGER NOT NULL REFERENCES SOTRUDNIKI ON DELETE NO ACTION ON UPDATE CASCADE, DATA_BEGIN DATE NOT NULL, UNIQUE (ID_UCH, DATA_BEGIN));
Принцип такой: SELECT
Принцип такой:
Да, именно так я сначала и подумал, но не всё так просто.
Этот запрос должен реализовывать выборку дат, которые пересекаются, а в данном случае, условие одновременности не выполняется. Вся изюминка в слове "одновременно", и с каким она "вкусом" я пока не разгадал