এটি একটি ধ্রুপদী সমস্যা, এবং আপনি যুক্তিটি বিপরীত করা আসলে এটি আরও সহজ easier
আমাকে যদি আপনি একটি উদাহরণ দিতে।
আমি এখানে সময়ের একটি সময় পোস্ট করব এবং অন্যান্য সময়কালের সমস্ত ভিন্নতা যা কোনওভাবে ওভারল্যাপ করে।
|-------------------| compare to this one
|---------| contained within
|----------| contained within, equal start
|-----------| contained within, equal end
|-------------------| contained within, equal start+end
|------------| not fully contained, overlaps start
|---------------| not fully contained, overlaps end
|-------------------------| overlaps start, bigger
|-----------------------| overlaps end, bigger
|------------------------------| overlaps entire period
অন্যদিকে, আমাকে যে সমস্ত ওভারল্যাপ হয় না তাদের সমস্ত পোস্ট করুন:
|-------------------| compare to this one
|---| ends before
|---| starts after
সুতরাং আপনি যদি তুলনাটি সহজ করেন তবে:
starts after end
ends before start
তারপরে আপনি এমন সমস্তগুলি খুঁজে পাবেন যা ওভারল্যাপ হয় না এবং তারপরে আপনি সমস্ত অ-মিলের সময়সীমা খুঁজে পাবেন।
আপনার চূড়ান্ত নয় তালিকার উদাহরণের জন্য, আপনি দেখতে পাচ্ছেন যে এটি দুটি নিয়মের সাথে মেলে।
নিম্নলিখিত সময়সীমার মধ্যে আপনার সীমার বাইরে বা বাইরে থাকা আপনার সিদ্ধান্ত নিতে হবে:
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
যদি আপনার টেবিলটিতে রেঞ্জ_এন্ড এবং রেঞ্জ_স্টার্ট নামক কলাম রয়েছে, সমস্ত মিলে যাওয়া সারিগুলি পুনরুদ্ধার করার জন্য এখানে কিছু সাধারণ এসকিউএল দেওয়া হয়েছে:
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
উল্লেখ্য নয় ওখানে। যেহেতু দুটি সহজ নিয়ম সমস্ত মিলহীন সারিগুলি সন্ধান করে, একটি সরল নট এটি বলার জন্য বিপরীত হবে: এটি যদি মিল না করা সারিগুলির মধ্যে একটি না হয় তবে এটি ম্যাচিংয়ের মধ্যে একটি হতে হবে ।
নোট থেকে পরিত্রাণ পেতে এখানে সাধারণ বিপরীত যুক্তি প্রয়োগ করা এবং আপনি এটি শেষ করবেন:
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start