आपको PostgreSQL में पहिया को फिर से शुरू करने की आवश्यकता नहीं है, ओवरलैप चेक प्राप्त करने के लिए दो सरल तरीके लागू किए गए हैं:
- एसक्यूएल का
OVERLAPS
ऑपरेटर :
काफी सरल,
where("(start_at, end_at) OVERLAPS (?, ?)", range.first, range.last)
हालांकि यह एक श्रेणी को दूसरे के ठीक बाद में सक्षम बनाता है
(दूसरे शब्दों में, यह प्रारंभ <=समय <अंत की जांच करता है )।
यह सरल भी है, आमतौर पर। लेकिन PostgreSQL में time
. के लिए बिल्ट-इन रेंज टाइप नहीं है (हालांकि tsrange
. हैं , tstzrange
, और daterange
अन्य अस्थायी प्रकारों के लिए)।
आपको अपने लिए यह श्रेणी प्रकार बनाने की आवश्यकता है:
CREATE TYPE timerange AS RANGE (subtype = time);
लेकिन इसके बाद, आप इसके साथ ओवरलैपिंग की जांच कर सकते हैं
where("timerange(start_at, end_at) && timerange(?, ?)", range.first, range.last)
श्रेणी प्रकार के लाभ:
-
आप अपने आप को नियंत्रित कर सकते हैं, आप सीमा की सीमाओं को कैसे संभालना चाहते हैं
एफ.ई.एक्स. आप उपयोग कर सकते हैं
timerange(start_at, end_at, '[]')
श्रेणियों के प्रारंभ और अंत-बिंदु दोनों को शामिल करने के लिए। डिफ़ॉल्ट रूप से इसमें प्रारंभ शामिल होता है, लेकिन श्रेणियों के अंत-बिंदु को शामिल नहीं करता है। -
इसे अनुक्रमित किया जा सकता है, f.ex. के साथ
CREATE INDEX events_times_idx ON events USING GIST (timerange(start_at, end_at));
-
बहिष्करण बाधाएं :यह अनिवार्य रूप से वही है, जिसे आप हासिल करना चाहते हैं, लेकिन इसे डीबी स्तर पर लागू किया जाएगा (जैसे,
UNIQUE
या कोई अन्य बाधा):ALTER TABLE events ADD CONSTRAINT events_exclude_overlapping EXCLUDE USING GIST (timerange(start_at, end_at) WITH &&);