Я подозреваю, что то, что вы хотите, может быть выполнено с помощью оператора case, но я не могу дать вам код, потому что следующая часть вашего вопроса не имеет смысла:
обновить действующий конец с минимальной датой, которая больше, чем эффективная дата начала текущей записи.