Я бы попытался работать со значениями NULL как можно дольше.
Мое понимание NULL в столбце EndDate заключалось бы в том, что на данный момент не определена дата окончания. Это согласуется с тем, что эта запись действительна с даты начала до даты окончания.
Я согласен с Quassnoi, что вы не можете напрямую указать
BETWEEN StartDate AND EndDate
но вместо его предложения (которое затрудняет использование индексов / индексов), этот работает также:
(somedate >= StartDate or StartDate is null)
AND
(somedate <= EndDate or EndDate is null)
AFAIK это позволит использовать индекс, но проверить план выполнения для ваших конкретных обстоятельств.
Недостатком использования «специальных» дат начала / окончания является принудительное выполнение. Если весь ваш доступ к БД осуществляется через определенный язык программы с более или менее обязательными библиотеками, вы можете выполнить эту работу. Однако, если у вас разные пути доступа (прямой SQL, разные языки / библиотеки), это будет очень сложно сделать.
Возможен третий способ: использование значений NULL для операторов DML, а затем изменение триггера на предопределенное значение min / max. Тогда выбор может быть проще. Но использование триггера открывает другую банку с червями ...
Мой вывод: этот сценарий является достойным использованием базы данных NULL. По моему опыту, я еще не столкнулся с серьезными проблемами производительности. Но я согласен, что дополнительная обработка NULL немного неприятна.