powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / определение ближайшей даты события по дате начала и интервалу
3 сообщений из 3, страница 1 из 1
определение ближайшей даты события по дате начала и интервалу
    #39886585
Duke_kz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.
Столкнулся с такой задачей.
Есть дата начала события в таблице и некий интервал срабатывания. Необходимо определить ближайшую дату, когда это событие должно выполнится, относительно текущей даты. Решается вроде через generate_series,
SELECT gs.code, max(gs.ls) AS ndate FROM (SELECT c.*, (generate_series(c.startdate, now()+intrvl, intrvl)) FROM...)
но при старой дате начала и коротком интервале генерируется очень много записей, что приводит к замедлению выполнения запроса.

Другой вариант
SELECT c.code, (startdate + (trunc(EXTRACT (epoch FROM (now() - c.startdate)) / EXTRACT(epoch FROM intrvl))::int + 1) * intrvl) AS ndate ...
с делением разности текущей даты и даты начала на длину интервала и последующее вычисление количества интервалов не работает для таких интервалов как месяц и год, из-за того что их длина переменная, в зависимости от того какой именно это месяц/год.

Может есть еще какие-то варианты решения?
...
Рейтинг: 0 / 0
определение ближайшей даты события по дате начала и интервалу
    #39886627
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Duke_kz

Может есть еще какие-то варианты решения?

материализовать дату последнего срабатывания?
...
Рейтинг: 0 / 0
определение ближайшей даты события по дате начала и интервалу
    #39886843
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Duke_kz,

можно как-то так пощупать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with c(code ,startdate) as (values
(-2,date'2019-01-05')
,(-1,date'2019-01-06')
,(0,'2019-01-07')
,(1,date'2019-01-08')
,(2,date'2019-01-09')
,(3,date'2019-01-10')
,(4,date'2019-01-11')
,(5,date'2019-01-12')
,(6,date'2019-01-13'))
,param (intrvl) as (values (interval'1 month'))

SELECT
	c.code
	,ndate
from c,param
,lateral(select  (startdate + ((EXTRACT (epoch FROM (now() - c.startdate)) / EXTRACT(epoch FROM intrvl))::int + g) * intrvl) AS ndate from generate_series(-1,1) g
where (startdate + ((EXTRACT (epoch FROM (now() - c.startdate)) / EXTRACT(epoch FROM intrvl))::int + g) * intrvl) >now()
order by 1 limit 1
) l

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / определение ближайшей даты события по дате начала и интервалу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]