I'm finishing off work on a complex rule-engine for Hotel Rates with real-time queries. There is a lot of conditions addressing intersections of periods for options, restrictions and policies. All of these are per date, meaning the time of day is irrelevant.
It varies wildly, from customer to customer, whether period spans a few days or several years, so it is not a feasible solution to denormalize to each day in the period for each thing in the system.
Currently, I'm using skip lists with 2 entries per 'thing' that has a period. Then I can intersect 'things' starting before end of relevant period, and ending after the beginning of the relevant period. This works ok, it's the best compromise so far, but I still end up mostly allocating nodes I don't need, and spending CPU filtering away 'from' nodes that don't have a corresponding 'to' node in the output set.
It is implemented in C# (state is in-mem, loaded by event-streams)), mostly immutable objects, classes for things that gets passed around a lot, structs for private collections within classes.