спасибо за чтение, это ситуация
У меня есть current_date и день месяца, поэтому мне нужно знать, какой будет следующая дата для этого дня месяца, учитывая, что какой-то месяцне имеет 30 и 31.
Пример:
- current_date = '2018-09-24'
- day_of_week = 31
Ожидаемый результат: '2018-12-31'
В настоящее время у меня есть это:
create or replace function next_diff(vals int[], current_val int) returns int as
$$
declare v int;
declare o int := vals[1];
begin
foreach v in array vals loop
if current_val >= o and current_val < v then
return v - current_val;
end if;
o := v;
end loop;
return vals[1] - current_val;
end;
$$ language plpgsql;
и это:
create or replace function next_day_of_month(days_of_month int[], curr_date date) returns date as
$$
declare cur_dom int := extract(day from curr_date);
declare next_diff int := next_diff(days_of_month, cur_dom);
begin
if next_diff < 0 then
curr_date := curr_date + '1 months'::interval;
end if;
curr_date := curr_date + (next_diff || 'days')::interval;
return curr_date;
end;
$$ language plpgsql;
но для этого звонка:
select next_day_of_month(array[31], '2018-09-24');
я получаю:
"2018-10-01"
Дополнительный пример
Если у меня есть это значение
- current_date = '2018-02-01'
- day_of_week = 31
я будунужен следующий месяц с 31-м, но я не могу получить «2018-02-31», потому что в феврале нет 31-го, тогда я должен получить «2018-02-31», потому что у марта 31-е.
Заключение
если месяц не имеет указанного дня, должен игнорировать месяц и переходить ко следующем.
спасибо за все
Финальный метод
Используя ответ Карлоса Гомеса, я создаю эту функцию PostgreSQL и отлично работаю:
create or replace function next_day_date(curr_date date, day_of_month int) returns date as
$$
declare next_day date;
begin
SELECT next_day_date into next_day FROM (
SELECT make_date_nullable(EXTRACT(year from n.month)::int, EXTRACT(month from n.month)::int, day_of_month) AS next_day_date
FROM (
SELECT generate_series(curr_date, curr_date + '3 months'::interval, '1 month'::interval) as month
) n
) results
WHERE results.next_day_date IS NOT NULL and results.next_day_date > curr_date LIMIT 1;
return next_day;
end;
$$ language plpgsql;
просто добавьте другой фильтр в пункт where and results.next_day_date > curr_date
, чтобы предотвратить получение тех же или предыдущих значений на указанную дату
Спасибо всем за помощь
Затем, Карлос, вы лучший
Gracias carlos eres el mejor:)