<div dir="ltr"><div>Hello LRUG</div><div><br></div><div>I have a Rails 5 app in development and I've run into a problem around database queries/ranges/dates that some of you might find interesting: </div><div><br></div><div><b>TL;DR:</b></div><div><br></div><div>Given a set of date ranges, return either</div><div> a) the one that Today lies within </div><div> b) if no such range exists, then the next range in the future</div><div> c) if no such range exists, then the last range in the past</div><div><br></div><div>  </div><div><b>Problem: </b></div><div><br></div><div>Say it's a site for listing details of club nights, past, present and future.</div><div><br></div><div>- Club nights happen at venues, and change venues pretty regularly. </div><div>- There are often periods between venue changes when a night isn't running at all. </div><div>- I need to be able to both schedule in future changes of venue, and record past venues.</div><div>- I need to display a list of club nights with their venue name - even if they're not currently running:</div><div><br></div><div>eg.</div><div>Club A - Venue A (currently running)</div><div>Club B - Venue B (closed on 01/02/2016)</div><div>Club C - Venue C (opens on 10/11/2016)</div><div>Club D - Venue D (reopens on 17/12/2016)</div><div><br></div><div>The rules on which venue to display on a particular day are:</div><div>- If the club is currently running, use the venue from the current season</div><div>- If not:</div><div>  - If there are no future seasons planned, use the most recent one</div><div>  - If there are future seasons planned, use the next one</div><div><br></div><div>My current database setup uses Postgres with 3 tables:</div><div>- club_night (name), has many seasons</div><div>- venue (name, address)</div><div>- season (start_date, end_date) belongs to a club night and has one venue</div><div><br></div><div>I'm struggling to represent those 3 rules in a single query.</div><div><br></div><div>I have a couple of ideas, all of which seem bad:</div><div>1. Write some SQL using `EXISTS` and conditionals to cover the 3 different cases</div><div>2. Fill in the gaps between seasons with 'not running' records with the right venue, so that all dates fall within some season</div><div>3. Load everything into ruby and work it all out with selects</div><div><br></div><div>Everything is up for grabs, including the data model, data store, software versions etc.<br><br>Any ideas gratefully received!<br><br>Duncan</div></div>