using System.Collections.Generic;
public static void Main()
var a = DateTime.Now.AddYears(-5).AddMonths(4);
var b = DateTime.Now.AddMonths(2);
var ranges = Chunk(DateTime.Now.AddYears(-10), DateTime.Now.AddYears(2), 1).ToList();
var relevantRanges2 = ranges
.Where(r => r.Start < a || r.Start < b)
.Where(r => r.End > a || r.End > b);
var relevantRanges3 = ranges.Where(r => r.OverlapsWithRange(a, b));
System.Console.WriteLine($"{a}->{b}");
System.Console.WriteLine("----------------------------------");
for (var i = 0; i < ranges.Count; ++i) {
if (relevantRanges3.Contains(ranges[i])) {
var queryStart = ranges[i].Start > a ? ranges[i].Start : a;
var queryEnd = ranges[i].End < b ? ranges[i].End : b;
newRange = $" *** {queryStart}->{queryEnd}";
System.Console.WriteLine($"{i}: {ranges[i].Start}->{ranges[i].End}{newRange}");
public TimeRange(DateTime s, DateTime e) { Start = s; End = e; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public bool OverlapsWithRange(DateTime start, DateTime end) =>
(Start < start || Start < end) && (start < End || end < End);
private static IEnumerable<TimeRange> Chunk(DateTime start, DateTime end, int chunkSize = 1)
var chunkEnd = start.AddYears(chunkSize).AddMilliseconds(-1);
yield return new TimeRange(chunkStart, chunkEnd);
chunkStart = chunkStart.AddYears(chunkSize);
chunkEnd = chunkEnd.AddYears(chunkSize);
yield return new TimeRange(chunkStart, end);