দুটি তারিখের ব্যাপ্তি ওভারল্যাপ হয় কিনা তা নির্ধারণ করুন


1248

দুটি তারিখের ব্যাপ্তি দেওয়া হয়েছে, দুটি তারিখের সীমাটি ওভারল্যাপ হয় কিনা তা নির্ধারণের সহজ বা সবচেয়ে কার্যকর উপায় কোনটি?

উদাহরণস্বরূপ, ধরুন আমরা তারিখসময় ভেরিয়েবল দ্বারা প্রকাশ রেঞ্জ আছে StartDate1করতে EndDate1 এবং StartDate2 করতে EndDate2



@ চার্লেসব্রেটানা এর জন্য ধন্যবাদ, আপনি ঠিক বলেছেন - এটি আমার প্রশ্নের দ্বিমাত্রিক সংস্করণের মতো!
আয়ান নেলসন


2
পরিস্থিতিগুলিকে 'দুটি তারিখের ছেদ ছেদ করে' কে ক্ষেত্রে বিভক্ত করুন (দুটি আছে) তারপরে প্রতিটি মামলার জন্য পরীক্ষা করুন।
কর্নেল আতঙ্ক

1
এই কোডটি সূক্ষ্মভাবে কাজ করে। : আপনি এখানে আমার উত্তর দেখতে পারেন stackoverflow.com/a/16961719/1534785
Jeyhun Rahimov

উত্তর:


2286

(স্টার্টএ <= এন্ডবি) এবং (এন্ডএ> = স্টার্টবি)

প্রুফ:
কন্ডিশনটির অর্থ হ'ল ডেট্রেঞ্জ একটি সম্পূর্ণরূপে ডেটরেঞ্জ বি
_ |---- DateRange A ------| |---Date Range B -----| _
(সত্য যদি StartA > EndB)

কন্ডিশনবি এর অর্থ হ'ল ডেট্রেঞ্জ এ সম্পূর্ণরূপে ডেটরেঞ্জ বি এর আগে
|---- DateRange A -----| _ _ |---Date Range B ----|
(সত্য যদি EndA < StartB)

তারপরে ওভারল্যাপ উপস্থিত থাকে যদি না ন ন বি সত্য হয় -
(যদি একটি রেঞ্জ সম্পূর্ণরূপে অন্যের পরে না হয় বা সম্পূর্ণরূপে অন্যটির
আগে না থাকে তবে অবশ্যই তাদের ওভারল্যাপ করা উচিত))

এখন দে মরগানের একটি আইন বলছে যে:

Not (A Or B) <=> Not A And Not B

যা অনুবাদ করে: (StartA <= EndB) and (EndA >= StartB)


দ্রষ্টব্য: এটিতে এমন শর্তাদি অন্তর্ভুক্ত রয়েছে যেখানে প্রান্তগুলি একেবারে ওভারল্যাপ করে। আপনি যে অগ্রাহ্য করতে চান,
পরিবর্তন >=করার জন্য অপারেটরদের >, এবং <= থেকে<


NOTE2। @Baodad জন্য ধন্যবাদ, দেখতে এই ব্লগে , প্রকৃত ওভারল্যাপ অন্তত হয়:
{ endA-startA, endA - startB, endB-startA, endB - startB}

(StartA <= EndB) and (EndA >= StartB) (StartA <= EndB) and (StartB <= EndA)


নোট 3. @ টমোসিয়াসকে ধন্যবাদ, একটি সংক্ষিপ্ত সংস্করণটি পড়ছে:
DateRangesOverlap = max(start1, start2) < min(end1, end2)
এটি আসলে দীর্ঘতর বাস্তবায়ন কীসের জন্য একটি সিনট্যাক্টিকাল শর্টকাট, এতে শুরুর তারিখগুলি শেষ তারিখগুলি বা তার আগে রয়েছে কিনা তা যাচাই করতে অতিরিক্ত চেক অন্তর্ভুক্ত করে। উপর থেকে এটিকে আবিষ্কার করা:

যদি শুরু এবং শেষের তারিখগুলি অর্ডার থেকে বাইরে চলে যেতে পারে, তবে যদি এটি সম্ভব হয় startA > endAবা startB > endB, তবে আপনাকে সেগুলি যথাযথভাবে রয়েছে কিনা তাও পরীক্ষা করতে হবে, যার অর্থ আপনাকে দুটি অতিরিক্ত বৈধতা বিধি যুক্ত করতে হবে:
(StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB) বা:
(StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB) বা,
(StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB)) বা:
(Max(StartA, StartB) <= Min(EndA, EndB)

তবে বাস্তবায়ন করতে Min()এবং Max(), আপনাকে কোড করতে হবে (ক্ষুদ্রতার জন্য সি টার্নারি ব্যবহার করে) ,:
(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)


29
এই দুটি অনুমানের ভিত্তিতে এটি একটি সরল যুক্তিযুক্ত: 1) স্টার্টএ <এন্ডএ; 2) স্টার্টবি <এন্ডবি। এটি সুস্পষ্ট বলে মনে হয় তবে বাস্তবে ডেটা ব্যবহারকারীর ইনপুট বা স্যানিটাইজেশন ছাড়াই একটি ডাটাবেসের মতো অজানা উত্স থেকে আসতে পারে। মনে রাখবেন যে আপনি এই সরলিকৃত যুক্তি ব্যবহার করার আগে বা দুটি কিছু বিচ্ছিন্ন হয়ে যাওয়ার আগে এই দুটি অনুমানগুলি সত্য কিনা তা নিশ্চিত করার জন্য আপনাকে ইনপুট ডেটা যাচাই করতে হবে। আমার নিজের অভিজ্ঞতা থেকে পাঠ শিখেছে;)
ডেভি

12
@ দেবী, আপনি ঠিক বলেছেন তা বাদে এটি startA = endA থাকলেও কাজ করবে। প্রকৃতপক্ষে, শব্দ Startএবং Endঅর্থ ঠিক এটাই। আপনার যদি শীর্ষ এবং নীচে, বা পূর্ব এবং পশ্চিম, বা হাইভ্যালু এবং লোভ্যালু নামে দুটি ভেরিয়েবল থাকে তবে এটি ধরে নেওয়া বা বোঝা যায় যে কোনও কিছু বা কেউ, কোথাও নিশ্চিত হওয়া উচিত যে কোনও একটি जोडটির বিপরীত ভেরিয়েবলগুলি সংরক্ষণ করা হয়নি। কেবলমাত্র দুটি জোড়ার একটি কারণ, ভাল, এটি উভয় জোড়া মানকে পরিবর্তন করা হলে এটিও কাজ করবে।
চার্লস ব্রেটানা

15
আপনি সহজেই যুক্ত করতে পারবেন startএবং end("নাল সূচনা" = "সময়ের শুরু থেকে" এবং "নাল প্রান্ত" = "সময়ের শেষ পর্যন্ত") এর মতো:(startA === null || endB === null || startA <= endB) && (endA === null || startB === null || endA >= startB)
কেভিন রোবটেল

9
স্ট্যাকেক্সচেঞ্জে সেরা উত্তর! এই স্মার্ট সূত্রটি কেন কাজ করে তার ব্যাখ্যা দেখে ভাল লাগছে!
আবির সুল

4
আমি ভাবতে পারি এমন সবচেয়ে কমপ্যাক্ট ফর্মটি এখানে, যা অবৈধ ইনপুট (শুরুর তারিখ> = শেষ তারিখ) এর ক্ষেত্রেও মিথ্যা ফিরিয়ে দেয়DateRangesOverlap = max(start1, start2) < min(end1, end2)
টমোসিয়াস

406

আমি বিশ্বাস করি যে দুটি রেঞ্জের ওভারল্যাপ হয়ে গেলে এটি বলা যথেষ্ট:

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)

76
আমি (StartDate1 <= EndDate2) and (EndDate1 >= StartDate2)স্বরলিপিটি বোঝা সহজ বলে মনে করি, পরীক্ষাগুলিতে রেঞ্জ 1 সর্বদা বামদিকে থাকে।
AL

8
এটি ধরে নেওয়া হয় যে শুরু এবং শেষ তারিখগুলি অন্তর্ভুক্ত। পরিবর্তন <=করার জন্য <যদি শুরু সমেত এবং শেষ স্বতন্ত্র।
রিচার্ড স্নাইডার

স্টার্টডেট 2 স্টার্টডেট 1 এর আগে হলেও এটি খুব ভালভাবে কাজ করবে। সুতরাং ধরে নেওয়ার দরকার নেই যে স্টার্টডেট 1 স্টার্টডেট 2 এর আগে is
শেহান সাইমেন

3
আমি (স্টার্টডেট 1 <= এন্ডডেট 2) এবং (স্টার্টডেট 2 <= এন্ড ডেট 1) স্বরলিপি খুঁজে পেয়েছি (উত্তর অনুসারে) অন্যান্য উত্তরের চেয়ে বোঝা সহজ।
এপিসি

কীভাবে মানিয়ে নেবেন যাতে এটি স্টার্টডেট 1 এবং / অথবা এন্ডডেট 1 রয়েছে এমন ডেটার সাথে কাজ করে? কোডটি ধরে নিয়েছে যে স্টার্টডেট 1 এবং এন্ডডেট 1 সর্বদা উপস্থিত থাকে। যদি স্টার্টডেট 1 দেওয়া হয় তবে এন্ডডেট 1 বা এন্ড ডেট 1 দেওয়া হয় তবে স্টার্টডেট 1 নয় not এই অতিরিক্ত কেসটি কীভাবে পরিচালনা করবেন?
juFo

117

.NET এর জন্য এই নিবন্ধের সময়কালীন গ্রন্থাগারটি গণনা পিরিয়ড রিলেশন দ্বারা দুটি সময়ের সময়কালের সম্পর্ক বর্ণনা করে :

// ------------------------------------------------------------------------
public enum PeriodRelation
{
    After,
    StartTouching,
    StartInside,
    InsideStartTouching,
    EnclosingStartTouching,
    Enclosing,
    EnclosingEndTouching,
    ExactMatch,
    Inside,
    InsideEndTouching,
    EndInside,
    EndTouching,
    Before,
} // enum PeriodRelation

এখানে চিত্র বর্ণনা লিখুন


ভাল, আমি জাভাতে অ্যালেন্স ব্যবধান বীজগণিতও প্রয়োগ করেছি , ইন্টারভালিলিলেশন এবং আইসোইন্টারভাল
মেনো

80

অস্থায়ী সম্পর্ক (বা অন্য কোনও অন্তর সম্পর্কের বিষয়ে যুক্তিযুক্ত হওয়ার জন্য) আসার জন্য অ্যালেনের অন্তর্বর্তী বীজগণিত বিবেচনা করুন । এটি ১৩ টি সম্ভাব্য সম্পর্কের বর্ণনা দেয় যা দুটি অন্তর একে অপরের প্রতি সম্মানের সাথে থাকতে পারে। আপনি অন্যান্য রেফারেন্সগুলি খুঁজে পেতে পারেন - "অ্যালেন ইন্টারভাল" একটি অপারেটিভ অনুসন্ধান শব্দ বলে মনে হচ্ছে। আপনি এসকিউএল- তে স্নোডগ্রাসের ডেভলপিং টাইম-ওরিয়েন্টড অ্যাপ্লিকেশনগুলিতে (পিআরএল অনলাইনে ইউআরএল উপলভ্য) এবং এই তারিখে, ডারউইন এবং লোরেন্টজাস টেম্পোরাল ডেটা এবং রিলেশনাল মডেল (২০০২) বা সময় এবং সম্পর্কিত সম্পর্কিত তত্ত্ব: এই ক্রিয়াকলাপগুলি সম্পর্কে তথ্যও পেতে পারেন সম্পর্কিত মডেল এবং এসকিউএল (2014; কার্যকরভাবে টিডি অ্যান্ড আরএম এর দ্বিতীয় সংস্করণ)।


সংক্ষিপ্ত (ইশ) উত্তরটি হল: দুটি তারিখ অন্তর Aএবং Bউপাদান .startএবং .endসীমাবদ্ধতার সাথে প্রদত্ত .start <= .end, তারপরে দুটি বিরতি ওভারল্যাপ করে যদি:

A.end >= B.start AND A.start <= B.end

ওভারল্যাপের ডিগ্রির জন্য আপনার প্রয়োজনীয়তাগুলি পূরণ করতে আপনি >=বনাম >এবং <=বনামের ব্যবহার টিউন করতে পারেন <


এরিক মন্তব্য:

আপনি যদি মজার বিষয় গণনা করেন তবে আপনি কেবল 13 পেতে পারেন ... আমি যখন এতে পাগল হয়ে যাই তখন আমি "দুটি অন্তরের সাথে থাকা 15 টি সম্ভাব্য সম্পর্ক" পেতে পারি। বুদ্ধিমান গণনা অনুসারে, আমি কেবল ছয়টি পেয়েছি এবং আপনি যদি A বা B আসেন তবে যত্ন নেওয়া বাদ দিলে আমি কেবল তিনটি পেয়েছি (কোনও ছেদ নয়, আংশিকভাবে ছেদ নেই, পুরোপুরি একের মধ্যে একটি)। 15 এর আগে চলে: [আগে: আগে, শুরু, ভিতরে, শেষ, পরে], [শুরু: শুরু, ভিতরে, শেষ, পরে], [ভিতরে: ভিতরে, শেষ, পরে], [শেষ: শেষ, পরে], [ পরে: পর]।

আমি মনে করি আপনি 'পূর্বে: আগে' এবং 'পরে: পরে' এই দুটি এন্ট্রি গণনা করতে পারবেন না। আমি 7 টি এন্ট্রি দেখতে পেলাম যদি আপনি তাদের বিপরীতগুলির সাথে কিছু সম্পর্ককে সমীকরণ করেন (রেফারেন্সযুক্ত উইকিপিডিয়া ইউআরএলে চিত্রটি দেখুন; এর ent টি এন্ট্রি রয়েছে, যার মধ্যে 6 টি আলাদা বিপরীতমুখী না হওয়ার সমতুল্য রয়েছে)। এবং তিনটি বুদ্ধিমান কিনা তা আপনার প্রয়োজনীয়তার উপর নির্ভর করে।

----------------------|-------A-------|----------------------
    |----B1----|
           |----B2----|
               |----B3----|
               |----------B4----------|
               |----------------B5----------------|
                      |----B6----|
----------------------|-------A-------|----------------------
                      |------B7-------|
                      |----------B8-----------|
                         |----B9----|
                         |----B10-----|
                         |--------B11--------|
                                      |----B12----|
                                         |----B13----|
----------------------|-------A-------|----------------------

1
আপনি যদি মজার বিষয় গণনা করেন তবে আপনি কেবল 13 পেতে পারেন ... আমি যখন এতে পাগল হয়ে যাই তখন আমি "দুটি অন্তরের সাথে থাকা 15 টি সম্ভাব্য সম্পর্ক" পেতে পারি। বুদ্ধিমান গণনা অনুসারে, আমি কেবল ছয়টি পেয়েছি এবং আপনি যদি A বা B আসেন তবে যত্ন নেওয়া বাদ দিলে আমি কেবল তিনটি পেয়েছি (কোনও ছেদ নয়, আংশিকভাবে ছেদ নেই, পুরোপুরি একের মধ্যে একটি)। 15 এর আগে চলে: [আগে: আগে, শুরু, ভিতরে, শেষ, পরে], [শুরু: শুরু, ভিতরে, শেষ, পরে], [ভিতরে: ভিতরে, শেষ, পরে], [শেষ: শেষ, পরে], [ পরে: পর]।
এরিক

@ এম্টুসিফোর: আমার মনে হয় আপনি দুটি আগে 'পূর্বে: আগে' এবং 'পরে: পরে' এন্ট্রি গণনা করতে পারবেন না।
জোনাথন লেফলার

আপনার আপডেটটি পুনরায় করুন: B1 থেকে A এর আগে: আগে এবং B13 থেকে A এর পরে: পরে। আপনার সুন্দর চিত্রটি অনুপস্থিত শুরু: বি 5 বি 6 এর মধ্যে শুরু এবং শেষ: বি 11 এবং বি 12 এর মধ্যে শেষ। তাহলে এন্ডপয়েন্টের হচ্ছে গুরুত্বপূর্ণ, তাহলে আপনি এটি গণনা, তাই চূড়ান্ত ট্যালি 15, না 13. আমি না মনে শেষবিন্দু জিনিস গুরুত্বপূর্ণ, তাই আমি ব্যক্তিগতভাবে এটি গণনা [আগে: আগে, মধ্যে, পরে] , [এর মধ্যে: এর মধ্যে, পরে], [পরে: পরে] যা আসে 6.. আমি মনে করি পুরো শেষ পয়েন্টটি হ'ল সীমাবদ্ধতা বা একচেটিয়া কিনা তা নিয়ে কেবল বিভ্রান্তি। শেষের পয়েন্টগুলির একচ্ছত্রতা মূল সম্পর্কের পরিবর্তন করে না!
এরিক

এটি হ'ল, আমার স্কিমগুলিতে এগুলি সমান: (বি 2, বি 3, বি 4), (বি 6, বি 7, বি 9, বি 10), (বি 8, বি 11, বি 12)। আমি বুঝতে পেরেছি যে বি 7 সেই তথ্যকে বোঝায় যা দুটি রেঞ্জের সাথে একত্রে মিলিত হয়। তবে আমি নিশ্চিত নই যে এই অতিরিক্ত তথ্যটি বেস ছেদ সম্পর্কের অংশ হওয়া উচিত। উদাহরণস্বরূপ, যখন দুটি অন্তর যথাযথ একই দৈর্ঘ্য হয় এমনকি যদি কাকতালীয় না হয় এমনকি ওভারল্যাপিংও হয় তবে সেটিকে কি অন্য "সম্পর্ক" হিসাবে বিবেচনা করা উচিত? আমি বলি না, এবং এই অতিরিক্ত দিকটি দেখা কেবলমাত্র B7 কে B6 থেকে পৃথক করে তোলা, তবে আমার মনে হয় এন্ডপয়েন্টস-এ-আলাদা-কেস থাকা বিষয়গুলিকে অসম্পূর্ণ করে তোলে।
এরিক

@ এম্টুসিফোর: ঠিক আছে - আমি কেন দেখি যে আমি 'আগে: আগে' এবং 'পরে: পরে' এন্ট্রি হিসাবে ভুল পরিচয় দিয়েছি; তবে, 'শুরু: শুরু' এবং 'শেষ: সমাপ্তি' এন্ট্রিগুলির দেখতে কেমন হওয়া উচিত তা আমি চিত্রিত করতে পারি না। যেহেতু আপনি আমার ডায়াগ্রামটি সম্পাদনা করতে পারবেন না, তাই আপনি কি আমাকে ডায়াগ্রামের 'স্টার্ট: স্টার্ট' এবং 'শেষ: শেষ' সম্পর্কগুলি দেখিয়ে একটি সংশোধিত অনুলিপি সহ ইমেল করতে পারেন (আমার প্রোফাইলটি দেখুন)? আপনার গ্রুপিংয়ের সাথে আমার কোনও বড় সমস্যা নেই।
জোনাথন লেফলার

30

ওভারল্যাপটি নিজেও গণনা করা উচিত, আপনি নিম্নলিখিত সূত্রটি ব্যবহার করতে পারেন:

overlap = max(0, min(EndDate1, EndDate2) - max(StartDate1, StartDate2))
if (overlap > 0) { 
    ...
}

সুতরাং দুটি ইভেন্ট ভাগ করে নেওয়ার পরিমাণটি কি ওভারল্যাপ হয়? এটি কি ইভেন্টগুলিকে ওভারল্যাপ করতে পারে বিভিন্ন উপায়ে কাজ করে?
এনএসজোনাস

18

রেঞ্জগুলি একে অপরের সাথে সম্পর্কযুক্ত যেখানে ভিত্তিতে প্রচুর শর্তাদি পরীক্ষা করে এমন সমস্ত সমাধান কেবলমাত্র একটি নির্দিষ্ট পরিসীমা শুরু হয় তা নিশ্চিত করে ব্যাপকভাবে সরল করা যায় ! আপনি নিশ্চিত হন যে সামঞ্জস্য প্রয়োজন সামনের দিকে সাময়িকভাবে অদলবদলের মাধ্যমে প্রথম (বা একই সময়ে) শুরু হয়।

তারপরে, আপনি যদি অন্য ব্যাপ্তির শুরু প্রথম ব্যাপ্তির শেষের চেয়ে কম বা সমান (তবে যদি পরিসীমা অন্তর্ভুক্ত থাকে তবে শুরু এবং শেষের সময় উভয়ই থাকে) বা এর চেয়ে কম হয় (তবে যদি ব্যাপ্তি শুরুতে অন্তর্ভুক্ত থাকে এবং শেষটি ব্যতীত হয়) ।

উভয় প্রান্তে অন্তর্ভুক্তি ধরে নিলে, কেবলমাত্র চারটি সম্ভাবনা রয়েছে যার একটি একটি অ ওভারল্যাপ:

|----------------------|        range 1
|--->                           range 2 overlap
 |--->                          range 2 overlap
                       |--->    range 2 overlap
                        |--->   range 2 no overlap

2 ব্যাপ্তির শেষ পয়েন্টটি এতে প্রবেশ করে না। সুতরাং, সিউডো কোডে:

def doesOverlap (r1, r2):
    if r1.s > r2.s:
        swap r1, r2
    if r2.s > r1.e:
        return false
    return true

এটি আরও সরল করা যেতে পারে এখানে:

def doesOverlap (r1, r2):
    if r1.s > r2.s:
        swap r1, r2
    return r2.s <= r1.e

শুরুতে যদি ব্যাপ্তিগুলি অন্তর্ভুক্ত থাকে এবং শেষের দিকে একচেটিয়া থাকে তবে আপনাকে কেবল দ্বিতীয় বিবৃতিটি >দিয়ে প্রতিস্থাপন করতে হবে (প্রথম কোড বিভাগের জন্য: দ্বিতীয় কোড বিভাগে, আপনি এর পরিবর্তে ব্যবহার করবেন ):>=if<<=

|----------------------|        range 1
|--->                           range 2 overlap
 |--->                          range 2 overlap
                       |--->    range 2 no overlap
                        |--->   range 2 no overlap

আপনার যে চেকগুলি করতে হবে তা আপনি প্রচুর পরিমাণে সীমাবদ্ধ করে রাখুন কারণ আপনি প্রথমার ব্যাপ্তি 2 এর পরে কখনই শুরু হবে না তা নিশ্চিত করে প্রারম্ভিক সমস্যার জায়গার অর্ধেকটি সরিয়ে ফেলুন।


2
অন্তর্ভুক্ত / একচেটিয়া সমস্যার উল্লেখ করার জন্য +1। আমি যখন সময় পেলাম তখন নিজেই একটি উত্তর বানাতে যাচ্ছিলাম, কিন্তু এখন দরকার নেই। জিনিসটি হ'ল আপনি প্রায় একই সাথে শুরু এবং শেষ উভয়কেই অন্তর্ভুক্ত হতে দেন না। আমার শিল্পে শুরুটি এক্সক্লুসিভ এবং শেষকে অন্তর্ভুক্ত হিসাবে বিবেচনা করা সাধারণ অভ্যাস, তবে আপনি যতক্ষণ না ধারাবাহিক থাকবেন ততক্ষণ উভয় দিকই ঠিক আছে। এটি এখনও পর্যন্ত এই প্রশ্নের প্রথম সম্পূর্ণ সঠিক উত্তর ... আইএমও।
ব্রায়ান গিডন

14

এখানে জাভাস্ক্রিপ্ট ব্যবহার করে আরও একটি সমাধান দেওয়া হয়েছে। আমার সমাধানের বৈশিষ্ট্যগুলি:

  • অসীম হিসাবে নাল মানগুলি পরিচালনা করে
  • ধরে নিন যে নিম্ন সীমাটি অন্তর্ভুক্ত এবং উপরের সীমাটি একচেটিয়া।
  • একগুচ্ছ পরীক্ষা দিয়ে আসে

পরীক্ষাগুলি পূর্ণসংখ্যার উপর ভিত্তি করে তবে জাভাস্ক্রিপ্টে তারিখের বিষয়গুলি তুলনীয় হওয়ায় আপনি কেবল দুটি তারিখের বস্তুতেও ফেলে দিতে পারেন। অথবা আপনি মিলিসেকেন্ড টাইমস্ট্যাম্পে ফেলে দিতে পারেন।

কোড:

/**
 * Compares to comparable objects to find out whether they overlap.
 * It is assumed that the interval is in the format [from,to) (read: from is inclusive, to is exclusive).
 * A null value is interpreted as infinity
 */
function intervalsOverlap(from1, to1, from2, to2) {
    return (to2 === null || from1 < to2) && (to1 === null || to1 > from2);
}

পরীক্ষা:

describe('', function() {
    function generateTest(firstRange, secondRange, expected) {
        it(JSON.stringify(firstRange) + ' and ' + JSON.stringify(secondRange), function() {
            expect(intervalsOverlap(firstRange[0], firstRange[1], secondRange[0], secondRange[1])).toBe(expected);
        });
    }

    describe('no overlap (touching ends)', function() {
        generateTest([10,20], [20,30], false);
        generateTest([20,30], [10,20], false);

        generateTest([10,20], [20,null], false);
        generateTest([20,null], [10,20], false);

        generateTest([null,20], [20,30], false);
        generateTest([20,30], [null,20], false);
    });

    describe('do overlap (one end overlaps)', function() {
        generateTest([10,20], [19,30], true);
        generateTest([19,30], [10,20], true);

        generateTest([10,20], [null,30], true);
        generateTest([10,20], [19,null], true);
        generateTest([null,30], [10,20], true);
        generateTest([19,null], [10,20], true);
    });

    describe('do overlap (one range included in other range)', function() {
        generateTest([10,40], [20,30], true);
        generateTest([20,30], [10,40], true);

        generateTest([10,40], [null,null], true);
        generateTest([null,null], [10,40], true);
    });

    describe('do overlap (both ranges equal)', function() {
        generateTest([10,20], [10,20], true);

        generateTest([null,20], [null,20], true);
        generateTest([10,null], [10,null], true);
        generateTest([null,null], [null,null], true);
    });
});

কর্মফল এবং জুঁই এবং ফ্যান্টমজেএস দিয়ে চালানোর সময় ফলাফল:

ফ্যান্টমজেএস ১.৯.৮ (লিনাক্স): ২০ টি সফলতার মধ্যে ২০ টি সাফল্য (0.003 সেকেন্ড / 0.004 সেকেন্ড)


9

আমি করবো

StartDate1.IsBetween(StartDate2, EndDate2) || EndDate1.IsBetween(StartDate2, EndDate2)

যেখানে IsBetweenকিছু আছে

    public static bool IsBetween(this DateTime value, DateTime left, DateTime right) {
        return (value > left && value < right) || (value < left && value > right);
    }

আমি পছন্দ করবো (বাম <মান && মান <ডান) || (ডান <মান && মান <বাম) এই পদ্ধতির জন্য।
প্যাট্রিক হুইজিংসা

এর জন্য ধন্যবাদ. আমার মাথায় জিনিস সহজ করে তোলে।
sshow

1
যখন আপনাকে কেবল দুটি পরীক্ষা করতে হবে আপনি কেন চারটি শর্ত পরীক্ষা করবেন? ব্যর্থ হয়।
এরিক

3
আহ, আমার ক্ষমা, আমি এখন দেখছি যে আপনি রেঞ্জগুলি বিপরীত ক্রমে (স্টার্টডেটএক্স> এন্ডডেটেক্স) হতে দিচ্ছেন। স্ট্রেঞ্জ। যাইহোক, স্টার্টেট 1 স্টার্টডেট 2 এর চেয়ে কম এবং এন্ডডেট 1 এন্ডডেট 2 এর চেয়ে বড় হলে কী হবে? আপনি যে কোডটি দিয়েছেন তা এই ওভারল্যাপিং শর্তটি সনাক্ত করতে পারে না।
এরিক

3
এই তারিখটিতে পুরো ডেট 2 থাকে তবে এই প্রত্যাবর্তনটি মিথ্যা হবে না? তারপরে স্টার্টডেট 1 স্টার্টডেট 2 এর আগে এবং শেষের তারিখ 1 এন্ডডেট 2 এর পরে
ব্যবহারকারী 158037

9

এখানে চিত্র বর্ণনা লিখুন

এখানে কোডটি যাদু করে:

 var isOverlapping =  ((A == null || D == null || A <= D) 
            && (C == null || B == null || C <= B)
            && (A == null || B == null || A <= B)
            && (C == null || D == null || C <= D));

কোথায়..

  • এ -> 1 স্টার্ট
  • বি -> 1 ইন্ড
  • সি -> 2 স্টার্ট
  • ডি -> 2 ইন্ড

প্রুফ? এই পরীক্ষার কনসোল কোডের টুকরোটি দেখুন


এটি কাজ করে, তবে আমি ওভারল্যাপিং না করার জন্য পরীক্ষা করতে পছন্দ করব, কেবল দুটি পরিস্থিতি
জন অ্যালবার্ট

ইমেজ ব্যবহার করে এটি ব্যাখ্যা করার জন্য ধন্যবাদ। আপনার উত্তর এই প্রশ্নের সঠিক সমাধান।
রকেশ ভার্মা

8

জাভাতে আমার সমাধানটি এখানে which

private Boolean overlap (Timestamp startA, Timestamp endA,
                         Timestamp startB, Timestamp endB)
{
    return (endB == null || startA == null || !startA.after(endB))
        && (endA == null || startB == null || !endA.before(startB));
}

আমি মনে করি আপনি উন্মুক্ত বিরতির পরিবর্তে আনবাউন্ডেড প্রান্তগুলি বোঝাতে চেয়েছিলেন।
হেনরিক


!startA.after(endB)মানে স্টার্টএ <= এন্ডবি এবং !endA.before(startB)মানে স্টার্টবি <= এন্ডএ। এগুলি একটি বন্ধ ব্যবধানের জন্য মাপদণ্ড এবং খোলার বিরতি নয়।
হেনরিক 12

সত্য @Henrik, এবং অন্যান্য অবস্থার যেমন endB == nullএবং startA == nullএকটি খোলা বিরতি জন্য চেক করুন।
খালেদ.কে

1
endB == null, startA == null, endA == nullএবং startB == nullএকটি সীমাবদ্ধ বিরতি জন্য চেক করতে সব মানদণ্ড এবং একটি খোলা বিরতি হয়। আনবাউন্ডেড এবং উন্মুক্ত ব্যবধানগুলির মধ্যে পার্থক্যের উদাহরণ: (10, 20) এবং (20, নাল) দুটি উন্মুক্ত বিরতি যা ওভারল্যাপ হয় না। শেষটির একটি সীমাহীন শেষ রয়েছে। আপনার ফাংশনটি সত্য হয়ে উঠবে, তবে অন্তরগুলি ওভারল্যাপ হয় না, কারণ অন্তরগুলিতে 20 টি অন্তর্ভুক্ত নয় ((সরলতার জন্য টাইমস্ট্যাম্পের পরিবর্তে ব্যবহৃত সংখ্যাগুলি)
হেনরিক

7

এখানে পোস্ট করা সমাধানটি সমস্ত ওভারল্যাপিং ব্যাপ্তির জন্য কাজ করে না ...

---------------------- | ------- একটি ------- | ----------- -----------
    | ---- খ 1 ---- |
           | ---- B2 তে ---- |
               | ---- বি 3 ---- |
               | ---------- B4 এ ---------- |
               | ---------------- B5 ---------------- |
                      | ---- বি 6 ---- |
---------------------- | ------- একটি ------- | ----------- -----------
                      | ------ B7 ------- |
                      | ---------- B8 ----------- |
                         | ---- B9 ---- |
                         | ---- B10 ----- |
                         | -------- B11 -------- |
                                      | ---- বি 12 ---- |
                                         | ---- B13 ---- |
---------------------- | ------- একটি ------- | ----------- -----------

আমার কাজের সমাধানটি ছিল:

এবং (
  ('start_date' BETWEEN STARTDATE and ENDDATE) - অভ্যন্তরীণ এবং শেষের তারিখ বাইরের জন্য পরিবেশন করে
  অথবা
  ('শেষের তারিখ' বিহীন শুরু এবং সমাপ্তি) - অভ্যন্তরীণ এবং শুরু তারিখের বাইরের জন্য পরিবেশন করে
  অথবা
  (START'TETWEEN 'start_date' এবং 'end_date' এর পরে) - তারিখগুলি ভিতরে যেখানে কেবল বাহ্যিক পরিসরের জন্য প্রয়োজন কেবল তার জন্য।
) 

5

মুহুর্তের সাথে এটি আমার জাভাস্ক্রিপ্ট সমাধান ছিল:

// Current row dates
var dateStart = moment("2014-08-01", "YYYY-MM-DD");
var dateEnd = moment("2014-08-30", "YYYY-MM-DD");

// Check with dates above
var rangeUsedStart = moment("2014-08-02", "YYYY-MM-DD");
var rangeUsedEnd = moment("2014-08-015", "YYYY-MM-DD");

// Range covers other ?
if((dateStart <= rangeUsedStart) && (rangeUsedEnd <= dateEnd)) {
    return false;
}
// Range intersects with other start ?
if((dateStart <= rangeUsedStart) && (rangeUsedStart <= dateEnd)) {
    return false;
}
// Range intersects with other end ?
if((dateStart <= rangeUsedEnd) && (rangeUsedEnd <= dateEnd)) {
    return false;
}

// All good
return true;

4

সমাধানটি মনে রাখার একটি সহজ উপায় হবে
min(ends)>max(starts)


3

মাইক্রোসফ্ট এসকিউএল সার্ভারে - এসকিউএল ফাংশন

CREATE FUNCTION IsOverlapDates 
(
    @startDate1 as datetime,
    @endDate1 as datetime,
    @startDate2 as datetime,
    @endDate2 as datetime
)
RETURNS int
AS
BEGIN
DECLARE @Overlap as int
SET @Overlap = (SELECT CASE WHEN  (
        (@startDate1 BETWEEN @startDate2 AND @endDate2) -- caters for inner and end date outer
        OR
        (@endDate1 BETWEEN @startDate2 AND @endDate2) -- caters for inner and start date outer
        OR
        (@startDate2 BETWEEN @startDate1 AND @endDate1) -- only one needed for outer range where dates are inside.
        ) THEN 1 ELSE 0 END
    )
    RETURN @Overlap

END
GO

--Execution of the above code
DECLARE @startDate1 as datetime
DECLARE @endDate1 as datetime
DECLARE @startDate2 as datetime
DECLARE @endDate2 as datetime
DECLARE @Overlap as int
SET @startDate1 = '2014-06-01 01:00:00' 
SET @endDate1 =   '2014-06-01 02:00:00'
SET @startDate2 = '2014-06-01 01:00:00' 
SET @endDate2 =   '2014-06-01 01:30:00'

SET @Overlap = [dbo].[IsOverlapDates]  (@startDate1, @endDate1, @startDate2, @endDate2)

SELECT Overlap = @Overlap

3

সহজতম

সবচেয়ে সহজ উপায় হ'ল তারিখের কাজের জন্য একটি ভাল ইঞ্জিনিয়ারড ডেডিকেটেড লাইব্রেরি ব্যবহার করা।

someInterval.overlaps( anotherInterval )

java.Time এবং থ্রিটেন-অতিরিক্ত

ব্যবসায়ের ক্ষেত্রে java.timeসেরাটি জাভা 8 এবং তার পরে নির্মিত ফ্রেমওয়ার্ক। যোগ যে ThreeTen-অতিরিক্ত প্রকল্প যে কাজী নজরুল ইসলাম অতিরিক্ত শ্রেণীর সাথে java.time, নির্দিষ্টভাবে Intervalশ্রেণী আমরা এখানে প্রয়োজন।

language-agnosticএই প্রশ্নের ট্যাগ হিসাবে , উভয় প্রকল্পের উত্স কোড অন্যান্য ভাষায় ব্যবহারের জন্য উপলব্ধ (তাদের লাইসেন্স বিবেচনা করুন)।

Interval

org.threeten.extra.Intervalবর্গ কুশলী, কিন্তু তারিখ-সময় মুহূর্ত (প্রয়োজন java.time.Instantবস্তু) বদলে তারিখ কেবল-মান। সুতরাং আমরা তারিখটি উপস্থাপনের জন্য ইউটিসিতে দিনের প্রথম মুহূর্তটি ব্যবহার করে এগিয়ে চলি।

Instant start = Instant.parse( "2016-01-01T00:00:00Z" );
Instant stop = Instant.parse( "2016-02-01T00:00:00Z" );

Intervalসময়ের যে বিস্তৃত প্রতিনিধিত্ব করতে একটি তৈরি করুন ।

Interval interval_A = Interval.of( start , stop );

আমরা Intervalএকটি প্রারম্ভিক মুহূর্ত প্লাস এ দিয়ে একটি সংজ্ঞা দিতে পারি Duration

Instant start_B = Instant.parse( "2016-01-03T00:00:00Z" );
Interval interval_B = Interval.of( start_B , Duration.of( 3 , ChronoUnit.DAYS ) );

ওভারল্যাপগুলির জন্য পরীক্ষার তুলনা করা সহজ is

Boolean overlaps = interval_A.overlaps( interval_B );

আপনি Intervalঅন্যের সাথে তুলনা করতে পারেন Intervalবা Instant:

এগুলি সমস্তই Half-Openসময়কে সংজ্ঞায়িত করার জন্য পদ্ধতির ব্যবহার করে যেখানে শুরুটি অন্তর্ভুক্ত এবং সমাপ্তি একচেটিয়া


3

এটি @ চার্লস-ব্রেটানার দুর্দান্ত উত্তরের একটি বর্ধন ।

উত্তরটি খোলা, বন্ধ এবং অর্ধ-খোলা (বা অর্ধ-বন্ধ) অন্তরগুলির মধ্যে পার্থক্য করে না।

কেস 1 : এ, বি বন্ধ বিরতি রয়েছে

A = [StartA, EndA]
B = [StartB, EndB]

                         [---- DateRange A ------]   (True if StartA > EndB)
[--- Date Range B -----]                           


[---- DateRange A -----]                             (True if EndA < StartB)
                         [--- Date Range B ----]

ওভারল্যাপ iff: (StartA <= EndB) and (EndA >= StartB)

কেস ২ : এ, বি খোলা অন্তর

A = (StartA, EndA)
B = (StartB, EndB)

                         (---- DateRange A ------)   (True if StartA >= EndB)
(--- Date Range B -----)                           

(---- DateRange A -----)                             (True if EndA <= StartB)
                         (--- Date Range B ----)

ওভারল্যাপ iff: (StartA < EndB) and (EndA > StartB)

কেস 3 : ক, খ ডান খোলা

A = [StartA, EndA)
B = [StartB, EndB)

                         [---- DateRange A ------)   (True if StartA >= EndB) 
[--- Date Range B -----)                           

[---- DateRange A -----)                             (True if EndA <= StartB)
                         [--- Date Range B ----)

ওভারল্যাপ শর্ত: (StartA < EndB) and (EndA > StartB)

কেস ৪ : ক, খ খোলা রেখে দিয়েছে

A = (StartA, EndA]
B = (StartB, EndB]

                         (---- DateRange A ------]   (True if StartA >= EndB)
(--- Date Range B -----]                           

(---- DateRange A -----]                             (True if EndA <= StartB)
                         (--- Date Range B ----]

ওভারল্যাপ শর্ত: (StartA < EndB) and (EndA > StartB)

কেস 5 : একটি ডান খোলা, বি বন্ধ

A = [StartA, EndA)
B = [StartB, EndB]

                         [---- DateRange A ------)    (True if StartA > EndB)
[--- Date Range B -----]                           


[---- DateRange A -----)                              (True if EndA <= StartB)  
                         [--- Date Range B ----]

ওভারল্যাপ শর্ত: (StartA <= EndB) and (EndA > StartB)

ইত্যাদি ...

অবশেষে, দুটি বিরতি ওভারল্যাপ করার জন্য সাধারণ শর্ত

(স্টার্টএ <🞐 এন্ডবি) এবং (এন্ডএ> 🞐 স্টার্টবি)

যেখানে two যখন দুটি অন্তর্ভুক্ত শেষ পয়েন্টের মধ্যে তুলনা করা হয় তখন একটি কঠোর বৈষম্যকে অ-কঠোর একে পরিণত করে।


দুটি, তিন, এবং চারটির ক্ষেত্রে একই ওভারল্যাপের অবস্থা রয়েছে, এটি কি ইচ্ছাকৃত?
মেরি

@ মেরি, আমি কেবল কয়েকটি কেস তালিকাভুক্ত করেছি (সমস্ত নয়)
ব্যবহারকারী 2314737

এটি, তবে জোনাথন লেফ্লারের উত্তর হিসাবে ওপিএস প্রশ্নের গ্রহণযোগ্য উত্তর হিসাবে আমার মনে যেটি ছিল তা ব্যাখ্যা করা হবে।
এমবিএক্স

3

মুহুর্তগুলি ব্যবহার করে সংক্ষিপ্ত উত্তর :

function isOverlapping(startDate1, endDate1, startDate2, endDate2){ 
    return moment(startDate1).isSameOrBefore(endDate2) && 
    moment(startDate2).isSameOrBefore(endDate1);
}

উত্তর উপরের উত্তরের উপর ভিত্তি করে তৈরি করা হয়েছে তবে এটি সংক্ষিপ্ত হয়ে গেছে।


2

আপনি যদি একটি তারিখের সীমা ব্যবহার করেন যা এখনও শেষ হয়নি (এখনও চলছে) উদাহরণস্বরূপ সেট করা হয়নি = '0000-00-00' আপনি নীচে ব্যবহার করতে পারবেন না কারণ 0000-00-00 একটি বৈধ তারিখ নয়!

আমি এই সমাধানটি ব্যবহার করেছি:

(Startdate BETWEEN '".$startdate2."' AND '".$enddate2."')  //overlap: starts between start2/end2
OR (Startdate < '".$startdate2."' 
  AND (enddate = '0000-00-00' OR enddate >= '".$startdate2."')
) //overlap: starts before start2 and enddate not set 0000-00-00 (still on going) or if enddate is set but higher then startdate2

যদি স্টার্টডেট 2 বেশি হয় তবে শেষের দিকে কোনও ওভারল্যাপ নেই!


2

উত্তরটি আমার পক্ষে খুব সহজ তাই আমি একটি আরও জেনেরিক ডায়নামিক এসকিউএল বিবৃতি তৈরি করেছি যা কোনও ব্যক্তির কোনও ওভারল্যাপিং তারিখ রয়েছে কিনা তা পরীক্ষা করে দেখুন।

SELECT DISTINCT T1.EmpID
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.EmpID = T2.EmpID 
    AND T1.JobID <> T2.JobID
    AND (
        (T1.DateFrom >= T2.DateFrom AND T1.dateFrom <= T2.DateTo) 
        OR (T1.DateTo >= T2.DateFrom AND T1.DateTo <= T2.DateTo)
        OR (T1.DateFrom < T2.DateFrom AND T1.DateTo IS NULL)
    )
    AND NOT (T1.DateFrom = T2.DateFrom)

2

@ ব্রেটানার দেওয়া গাণিতিক সমাধান ভাল তবে দুটি নির্দিষ্ট বিবরণ উপেক্ষা করুন:

  1. বন্ধ বা অর্ধ-খোলা বিরতি দিক
  2. খালি বিরতি

অন্তর্বর্তী সীমানার বন্ধ বা উন্মুক্ত স্থিতি সম্পর্কে, বন্ধ বর্ধনের জন্য বৈধ @ ব্রেটানার সমাধান

(স্টার্টএ <= এন্ডবি) এবং (এন্ডএ> = স্টার্টবি)

অর্ধ-খোলা ব্যবধানগুলির জন্য এখানে আবার লেখা যেতে পারে :

(স্টার্টএ <এন্ডবি) এবং (এন্ডএ> স্টার্টবি)

এই সংশোধন আবশ্যক কারণ একটি খোলার বিরতি সীমানা সংজ্ঞা অনুসারে একটি অন্তরালের মান পরিসরের সাথে সম্পর্কিত নয়।


এবং খালি বিরতি সম্পর্কে , ভাল, এখানে উপরে প্রদর্শিত সম্পর্কটি ধরে রাখে না। সংজ্ঞা অনুসারে কোনও বৈধ মান না থাকা খালি অন্তরগুলিকে বিশেষ কেস হিসাবে পরিচালনা করতে হবে। আমি এটি আমার জাভা টাইম লাইব্রেরি টাইম 4 জে উদাহরণ দিয়ে দেখিয়েছি :

MomentInterval a = MomentInterval.between(Instant.now(), Instant.now().plusSeconds(2));
MomentInterval b = a.collapse(); // make b an empty interval out of a

System.out.println(a); // [2017-04-10T05:28:11,909000000Z/2017-04-10T05:28:13,909000000Z)
System.out.println(b); // [2017-04-10T05:28:11,909000000Z/2017-04-10T05:28:11,909000000Z)

নেতৃস্থানীয় বর্গাকার বন্ধনী "[" একটি বন্ধ শুরু সূচিত করে যখন শেষ বন্ধনী ")" একটি মুক্ত প্রান্ত নির্দেশ করে।

System.out.println(
      "startA < endB: " + a.getStartAsInstant().isBefore(b.getEndAsInstant())); // false
System.out.println(
      "endA > startB: " + a.getEndAsInstant().isAfter(b.getStartAsInstant())); // true

System.out.println("a overlaps b: " + a.intersects(b)); // a overlaps b: false

উপরে প্রদর্শিত হিসাবে, খালি ব্যবধানগুলি ওভারল্যাপ শর্তটি উপরের (বিশেষত স্টার্টএ <এন্ডবি) লঙ্ঘন করে, তাই টাইম 4 জ (এবং অন্যান্য গ্রন্থাগারগুলিকেও) কোনও খালি ব্যবধানের সাথে যেকোনো স্বেচ্ছাসেবী ব্যবস্থার ওভারল্যাপের গ্যারান্টি নিশ্চিত করার জন্য এটি বিশেষ প্রান্তের কেস হিসাবে পরিচালনা করতে হবে এটির অস্তিত্ব নেই. অবশ্যই, তারিখের অন্তরগুলি (যা টাইম 4 জে ডিফল্টরূপে বন্ধ থাকে তবে অর্ধ-খোলাও হতে পারে, খালি তারিখের বিরতির মতো )ও একইভাবে পরিচালনা করা হয়।


1

এখানে একটি জেনেরিক পদ্ধতি যা স্থানীয়ভাবে কার্যকর হতে পারে।

    // Takes a list and returns all records that have overlapping time ranges.
    public static IEnumerable<T> GetOverlappedTimes<T>(IEnumerable<T> list, Func<T, bool> filter, Func<T,DateTime> start, Func<T, DateTime> end)
    {
        // Selects all records that match filter() on left side and returns all records on right side that overlap.
        var overlap = from t1 in list
                      where filter(t1)
                      from t2 in list
                      where !object.Equals(t1, t2) // Don't match the same record on right side.
                      let in1 = start(t1)
                      let out1 = end(t1)
                      let in2 = start(t2)
                      let out2 = end(t2)
                      where in1 <= out2 && out1 >= in2
                      let totover = GetMins(in1, out1, in2, out2)
                      select t2;

        return overlap;
    }

    public static void TestOverlap()
    {
        var tl1 = new TempTimeEntry() { ID = 1, Name = "Bill", In = "1/1/08 1:00pm".ToDate(), Out = "1/1/08 4:00pm".ToDate() };
        var tl2 = new TempTimeEntry() { ID = 2, Name = "John", In = "1/1/08 5:00pm".ToDate(), Out = "1/1/08 6:00pm".ToDate() };
        var tl3 = new TempTimeEntry() { ID = 3, Name = "Lisa", In = "1/1/08 7:00pm".ToDate(), Out = "1/1/08 9:00pm".ToDate() };
        var tl4 = new TempTimeEntry() { ID = 4, Name = "Joe", In = "1/1/08 3:00pm".ToDate(), Out = "1/1/08 8:00pm".ToDate() };
        var tl5 = new TempTimeEntry() { ID = 1, Name = "Bill", In = "1/1/08 8:01pm".ToDate(), Out = "1/1/08 8:00pm".ToDate() };
        var list = new List<TempTimeEntry>() { tl1, tl2, tl3, tl4, tl5 };
        var overlap = GetOverlappedTimes(list, (TempTimeEntry t1)=>t1.ID==1, (TempTimeEntry tIn) => tIn.In, (TempTimeEntry tOut) => tOut.Out);

        Console.WriteLine("\nRecords overlap:");
        foreach (var tl in overlap)
            Console.WriteLine("Name:{0} T1In:{1} T1Out:{2}", tl.Name, tl.In, tl.Out);
        Console.WriteLine("Done");

        /*  Output:
            Records overlap:
            Name:Joe T1In:1/1/2008 3:00:00 PM T1Out:1/1/2008 8:00:00 PM
            Name:Lisa T1In:1/1/2008 7:00:00 PM T1Out:1/1/2008 9:00:00 PM
            Done
         */
    }

1
public static class NumberExtensionMethods
    {
        public static Boolean IsBetween(this Int64 value, Int64 Min, Int64 Max)
        {
            if (value >= Min && value <= Max) return true;
            else return false;
        }

        public static Boolean IsBetween(this DateTime value, DateTime Min, DateTime Max)
        {
            Int64 numricValue = value.Ticks;
            Int64 numericStartDate = Min.Ticks;
            Int64 numericEndDate = Max.Ticks;

            if (numricValue.IsBetween(numericStartDate, numericEndDate) )
            {
                return true;
            }

            return false;
        }
    }

public static Boolean IsOverlap(DateTime startDate1, DateTime endDate1, DateTime startDate2, DateTime endDate2)
        {
            Int64 numericStartDate1 = startDate1.Ticks;
            Int64 numericEndDate1 = endDate1.Ticks;
            Int64 numericStartDate2 = startDate2.Ticks;
            Int64 numericEndDate2 = endDate2.Ticks;

            if (numericStartDate2.IsBetween(numericStartDate1, numericEndDate1) ||
                numericEndDate2.IsBetween(numericStartDate1, numericEndDate1) ||
                numericStartDate1.IsBetween(numericStartDate2, numericEndDate2) ||
                numericEndDate1.IsBetween(numericStartDate2, numericEndDate2))
            {
                return true;
            }

            return false;
        } 


if (IsOverlap(startdate1, enddate1, startdate2, enddate2))
            {
                Console.WriteLine("IsOverlap");
            }

3
কিছু ব্যাখ্যা যোগ করার মন আছে?
ফ্যান্টিম্যাক্সএক্স

1

জাভা ব্যবহার করে। তারিখ, এখানে আমি কি করেছি।

    public static boolean checkTimeOverlaps(Date startDate1, Date endDate1, Date startDate2, Date endDate2)
    {
        if (startDate1 == null || endDate1 == null || startDate2 == null || endDate2 == null)
           return false;

        if ((startDate1.getTime() <= endDate2.getTime()) && (startDate2.getTime() <= endDate1.getTime()))
           return true;

        return false;
    }

1

আমার মতে এটি করার সহজতম উপায়টি তুলনা করা হবে যদি হয় EndDate1 স্টার্টেট 2 এর আগে হয় এবং শেষ তারিখ 2 স্টার্টডেট 1 এর আগে হয়।

অবশ্যই যদি আপনি অন্তরগুলির বিবেচনা করছেন যেখানে স্টার্টডেট সর্বদা শেষের তারিখের আগে থাকে।


1

আমার একটি পরিস্থিতি ছিল যেখানে আমাদের তারিখের পরিবর্তে তারিখ ছিল এবং তারিখগুলি কেবল শুরু / শেষের দিকে ওভারল্যাপ হতে পারে। নীচে উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

(সবুজ হ'ল বর্তমান ব্যবধান, নীল ব্লকগুলি বৈধ অন্তর, লালগুলি অন্তরালে ওভারল্যাপিং হয়)।

আমি নীচের সমাধানে আয়ান নেলসনের উত্তরটি অভিযোজিত করেছি:

   (startB <= startA && endB > startA)
|| (startB >= startA && startB < endA)

এটি সমস্ত ওভারল্যাপের ক্ষেত্রে মেলে তবে অনুমোদিত ওভারল্যাপগুলি এড়িয়ে চলে।


0

সমস্যাগুলিকে কেসগুলিতে ভাগ করুন এবং তারপরে প্রতিটি কেস পরিচালনা করুন

পরিস্থিতি 'দুটি তারিখের ছেদটি ছেদ করে' দুটি ক্ষেত্রে আচ্ছাদিত হয় - প্রথম তারিখের সীমাটি দ্বিতীয়টির মধ্যে শুরু হয়, বা দ্বিতীয় তারিখের সীমাটি প্রথমটির মধ্যেই শুরু হয়।


0

আপনি এটি চেষ্টা করতে পারেন:

//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");

//create a date period object
$interval = new DateInterval('P1D');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);

0

এটি আমার সমাধান ছিল, মানগুলি ওভারল্যাপ না হলে এটি সত্য হয়:

এক্স স্টার্ট 1 ওয়াই এন্ড 1

একটি স্টার্ট 2 বি এন্ড 2

TEST1: (X <= A || X >= B)
        &&
TEST2: (Y >= B || Y <= A) 
        && 
TEST3: (X >= B || Y <= A)


X-------------Y
    A-----B

TEST1:  TRUE
TEST2:  TRUE
TEST3:  FALSE
RESULT: FALSE

---------------------------------------

X---Y
      A---B

TEST1:  TRUE
TEST2:  TRUE
TEST3:  TRUE
RESULT: TRUE

---------------------------------------

      X---Y
A---B

TEST1:  TRUE
TEST2:  TRUE
TEST3:  TRUE
RESULT: TRUE

---------------------------------------

     X----Y
A---------------B

TEST1:  FALSE
TEST2:  FALSE
TEST3:  FALSE
RESULT: FALSE

0

রুবির জন্য আমি এটিও পেয়েছি:

class Interval < ActiveRecord::Base

  validates_presence_of :start_date, :end_date

  # Check if a given interval overlaps this interval    
  def overlaps?(other)
    (start_date - other.end_date) * (other.start_date - end_date) >= 0
  end

  # Return a scope for all interval overlapping the given interval, including the given interval itself
  named_scope :overlapping, lambda { |interval| {
    :conditions => ["id <> ? AND (DATEDIFF(start_date, ?) * DATEDIFF(?, end_date)) >= 0", interval.id, interval.end_date, interval.start_date]
  }}

end

এটি এখানে সুন্দর ব্যাখ্যা সহ পেয়েছে -> http://makandracards.com/makandra/984-test-if-two-date-ranges-overlap-in-ruby-or-rails


0

ক্যোয়ারির নীচে আমাকে এইডস দেয় যার জন্য সরবরাহিত তারিখের সীমা (শুরু এবং শেষের তারিখগুলি আমার টেবিলের নামের কোনও তারিখ (শুরু এবং শেষ তারিখগুলি) দিয়ে ওভারল্যাপ করে

select id from table_name where (START_DT_TM >= 'END_DATE_TIME'  OR   
(END_DT_TM BETWEEN 'START_DATE_TIME' AND 'END_DATE_TIME'))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.