Use an exclusion constraint and be aware how bounds for the type daterange
work. date
is a discrete type, so ranges have default [)
bounds. The manual:
The built-in range types int4range
, int8range
, and daterange
all use a
canonical form that includes the lower bound and excludes the upper
bound; that is, [)
.
So, to book a room from 2016-01-01 to 2016-01-05, including first and last day, you have to specify bounds explicitly:
daterange(start_date, end_date, '[]')
Or you enter dates with exclusive upper bounds; to include 2016-01-05, enter 2016-01-06. Then you can use the simpler expression:
daterange(start_date, end_date)
Either create a functional index with the above expression in the exclusion constraint, like demonstrated here:
This way you can keep columns like you have right now.
Or you can replace startdate
and enddate
with a daterange
column and use the plain column in the exclusion constraint. Like in this related answer:
In any case, assuming roomno
is an integer
column, you need to install the additional module btree_gist
first, once per database. See: