Temporal constraints

시간 범위 제약

PostgreSQL 18 can reject overlapping validity periods through key constraints.

···
html
<div class="demo"><div class="head"><b>WITHOUT OVERLAPS</b><span>room A</span></div><div class="stage timeline"><div class="axis"><div class="bar old">existing 10–12</div><div class="bar new" id="booking">11–13</div></div></div><div class="foot"><span id="bookstatus">overlap: rejected</span><span>time range</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.timeline{width:100%}.axis{width:100%;height:90px;position:relative;border-bottom:2px solid var(--line);background:repeating-linear-gradient(90deg,transparent 0 19%,var(--line) 20%,transparent 21% 25%)}.bar{position:absolute;height:31px;border-radius:6px;padding:7px;text-align:center;white-space:nowrap;overflow:hidden}.old{left:8%;top:6px;width:48%;background:color-mix(in srgb,var(--accent) 24%,var(--surface));border:1px solid var(--accent)}.new{left:33%;top:47px;width:47%;background:color-mix(in srgb,#e16a5d 24%,var(--surface));border:1px solid #e16a5d;transition:left .35s,width .35s}.new.ok{left:57%;width:34%;border-color:var(--accent);background:color-mix(in srgb,var(--accent) 17%,var(--surface))}
js
let n=0;function tick(){let e=document.getElementById('booking');e.classList.toggle('ok',!!n);e.textContent=n?'12–14':'11–13';document.getElementById('bookstatus').textContent=n?'adjacent: accepted':'overlap: rejected';n=1-n}tick();const t=setInterval(tick,1250);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

PostgreSQL 18 adds WITHOUT OVERLAPS to PRIMARY KEY and UNIQUE constraints over ranges. The database can reject overlapping periods for the same resource.

The demo rejects a new booking that overlaps an existing one and accepts an adjacent range. Model endpoint inclusivity and the resource key carefully to catch the intended conflicts.

When to use

Use it for bookings, contracts, or prices whose validity windows must not overlap for one resource.

Open as page ↗