если вы можете немного изменить свои таблицы, вы можете сделать это с помощью внешнего ключа и проверочного ограничения:
CREATE TABLE calendar_month (
id serial PRIMARY KEY,
start_date date NOT NULL UNIQUE,
end_date date NOT NULL,
reporting_month character varying(50) NOT NULL
);
CREATE TABLE calendar (
id serial PRIMARY KEY,
month_start_date date NOT NULL REFERENCES calendar_month(start_date),
holiday bool NOT NULL,
actual_date date NOT NULL CHECK (
actual_date>=month_start_date and
actual_date<(month_start_date+'1 month'::interval)::date)
);
РЕДАКТИРОВАТЬ: Мохан сказал, что «конечная дата в строке календаря не обязательно будет= дата начала + интервал 1 месяц ".Предположим, что мы не можем делать какие-либо предположения относительно фактической даты начала и окончания месяца, нам нужно сделать что-то немного (как предлагает сам Мохан):
CREATE TABLE calendar_month (
id serial PRIMARY KEY,
start_date date NOT NULL,
end_date date NOT NULL,
reporting_month character varying(50) NOT NULL,
UNIQUE(start_date, end_date)
);
CREATE TABLE calendar (
id serial PRIMARY KEY,
month_start_date date NOT NULL,
month_end_date date NOT NULL,
holiday bool NOT NULL,
foreign key(month_start_date, month_end_date)
REFERENCES calendar_month(start_date, end_date) )
actual_date date NOT NULL
CHECK (actual_date>=month_start_date and actual_date<month_end_date)
);
Или, возможно, actual_date<month_end_date
должно быть actual_date<=month_end_date
в ограничении check
- это зависит от того, как вы определяете границы месяца.