Я видел разные способы хранить интервалы дат в реляционках.  Не, понятно, там два столбца, типа dt_start + dt_end, но кое-какие моменты не доходят до людей вообще.  Попробую исправить.
- null как дата начала/окончания -- неудобно.  Правильное решение: фиксированные даты типа 01.01.0001 и 31.12.9999 и функции/вьюхи для получения видимой пользователем даты (если такая будет).  Это только выглядит криво, а на самом деле спасает от тонн ошибок, связанных с нуллами.
- главное: дата начала -- включительно, дата окончания -- исключительно.  То есть, если есть дата начала 2014-12-07 00:00:00 и дата окончания 2014-12-08 00:00:00, в этот интервал попадают все даты 2014-12-07 XX:XX:XX, но не попадают 2014-12-08 00:00:00 и больше неё.  С такими раскладами не получится сделать where mydate between dt_start and dt_end (если бы обе даты были "включительно"), но это абсолютно похуй, так как профит перевешивает: 1. условия не зависят от типов и форматов дат: в случае преобразования даты+времени в дату (если часы были 00:00:00) либо преобразования даты в дату+время (когда добавляют часы 00:00:00 к дате без часов) код продолжает работать как и раньше (а такие преобразования не всегда видны в коде невооружённым глазом, неявные преобразования типов таки случаются).  2. нет привязки к тому, какой "квант времени" подразумевался.  Если бы интервал из примера выше был записан "концы включительно, квант = сутки", было бы "2014-12-07 .. 2014-12-07".  Если бы надо было разбивать на часы, интервал внезапно преобразился бы в "2014-12-07 00:00:00 .. 2014-12-07 23:00:00".  3. часто надо рассмотреть "какие интервалы попадают на данную дату-время".  В случае "квант = сутки" имеем where trunc(dt, 'DD') between dt_start and dt_end, заметьте функцию для обрезания даты и явное указание, докуда обрезать.  А функции, как известно, не очень хорошо сотрудничают с оптимизатором запросов.
- следствие обоих пунктов: валидация становится не сложнее, чем check (dt_start < dt_end) (для непустых интервалов) или check (dt_start <= dt_end) (для возможно пустых интервалов).
- для извращенцев: with recursive либо connect by по условию prev.dt_end = next.dt_start