Здравствуйте, возникла проблема с запросом на выборку дат.

Всем доброго времени суток.
Если вы не против перейду сразу к сути дела. У меня есть некая база данных (Аренда земельных участков) и появилась такая задача, что надо вывести участки, которые арендуются одновременно по нескольким делам. И теперь я не знаю, как вывести из одной таблицы, там где есть дата начала аренды, значения, которые могут пересекаться по дате аренды (то есть когда одна дата частично или полностью покрывает другую). Если у кого-нибудь есть какие-нибудь идеи или предложения, то я внимательно слушаю :)

Это схема данных, но тут нужны только 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));

Заранее спасибо за вашу помощь :)
Если так сложно разобраться, то ниже прилагается cссылка .doc, в котором более всё подробно.
https://cloud.mail.ru/public/KMWW/YodhnYdyX

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Принцип такой: SELECT

Принцип такой:

SELECT Uchastki.id_uch
FROM Uchastki
         JOIN Arenda ON (Arenda.id_uch = Uchastki.id_uch)
GROUP BY Uchastki.id_uch
HAVING COUNT(Arenda.N_dela) > 1

Да, именно так я сначала и подумал, но не всё так просто.

Этот запрос должен реализовывать выборку дат, которые пересекаются, а в данном случае, условие одновременности не выполняется. Вся изюминка в слове "одновременно", и с каким она "вкусом" я пока не разгадал ;)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023