У меня есть следующая DATES_TABLE (id, start_date, duration_period). Мне нужно удалить период продолжительности и указать дату окончания в качестве поля.
Я использую следующий сценарий для обновления даты окончания:
alter table DATES_TABLE add END_DATE date;
update DATES_TABLE
SET END_DATE = add_months (START_DATE, DURATION_PERIOD * 12);
Если дата начала была 01.01.2018, а продолжительность прогноза - 10, то дата окончания будет установлена на 01.01.2028. Это правильно, но дату окончания необходимо установить на последний день года, то есть 31.12.2028. Во всех случаях год должен измениться, но день должен быть 31, а месяц декабрем.
Как я могу это сделать в sql?
Спасибо.
См. end_date как не включенный в период (период всегда> = start_date и <end_date). В любом случае это правильный способ - полностью включить последний день независимо от того, насколько точное время (секунды, миллисекунды, наносекунды, не имеет значения).


update DATES_TABLE
SET END_DATE =
trunc(
add_months(
add_months (START_DATE, DURATION_PERIOD * 12),
12),
'YYYY')
- 1;
Следите за этой датой, в том же году после 31/12 / NNNN 00:00:00 остался целый день. Если вы хотите учесть это, просто вычтите одну секунду iso. один день.
Как заметил Эльер, я все еще тратил там несколько циклов процессора.
update DATES_TABLE
SET END_DATE =
trunc(
add_months (START_DATE, (DURATION_PERIOD + 1) * 12),
'YYYY')
- 1;
Если я хорошо понимаю, вам может понадобиться что-то вроде следующего:
update dates_table
set end_date = to_date('31-12-' || extract(year from add_months(start_date, duration_period *12)), 'dd-mm-yyyy')
Попробуйте оба и рассчитайте время.
попробуй это :
update testdate
SET END_DATE = add_months (trunc(START_DATE,'y'),12)-1;
Я не понимаю правил, которые вы используете. Что будет, если вы прибавите 9 месяцев? Что, если дата начала - 2 января? 30 янв?