powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как в результате получить список дат
10 сообщений из 10, страница 1 из 1
как в результате получить список дат
    #37671820
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно написать функцию, которая бы возрващала рекордсет следующего вида.
Задается период дат и период разделения день, неделя, месяц, квартал.
Например задаем 1 января и 17 мая и внутренний период например месяц.
В результате получаем такую таблицу
начало конец01.01.201231.01.201201.02.201228.02.201201.03.201231.03.201201.04.201230.04.201201.05.201217.05.2012
Как такое можно реализовать?
...
Рейтинг: 0 / 0
как в результате получить список дат
    #37671963
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
PG81,

А в чем именно проблема? Если вам нужны начальная и конечная даты периода, напр., в 1 месяц, то длина вашего шага при вычислении = '1 month'::interval - '1 day'::interval. Потом проверьте, не убежали ли вы за конечную дату, если да — верните ее. Готово.
...
Рейтинг: 0 / 0
как в результате получить список дат
    #37672266
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я приблизительно представляю как это делать, но точно не знаю как.

Я представляю себе алгоритм так. Нужно в цикле формировать эти подпериоды и добавлять их в массив а потом вывести.

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

Я представляю себе алгоритм так. Нужно в цикле формировать эти подпериоды и добавлять их в массив а потом вывести.

Интерисует есть ли другие варианты?

помедитируйте на тему
Код: plsql
1.
2.
3.
4.
5.
6.
7.
deallocate all;
PREPARE foo (date,date,text) AS
(SELECT ($1+(t * ('1 ' ||$3)::interval))::date  , ($1+((t+1) * ('1 ' ||$3)::interval))::date -1, t FROM generate_series(0,($2-$1)) t
WHERE ($1+(t * ('1 ' ||$3)::interval))::date < $2);
EXECUTE foo('2012-01-01' ,'2013-01-01','month');
EXECUTE foo('2012-01-01' ,'2013-01-01','day');
EXECUTE foo('2012-01-01' ,'2013-01-01','week');


только обрезание вот тут generate_series(0,($2-$1)) надо бы ужесточить с учетом $3, добавить case when для обрезки по границе (границам) и т.п.
...
Рейтинг: 0 / 0
как в результате получить список дат
    #37672992
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select generate_series( '01.01.2012'::date, '17.05.2012'::date, '1 month'::interval );

от этого плясать...
...
Рейтинг: 0 / 0
как в результате получить список дат
    #37673605
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
PG81я приблизительно представляю как это делать, но точно не знаю как.

Я представляю себе алгоритм так. Нужно в цикле формировать эти подпериоды и добавлять их в массив а потом вывести.

Интерисует есть ли другие варианты?

Напр., так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function foo(date, date, interval) returns setof record as $$
declare
	result record;
	start_date alias for $1;
	end_date alias for $2;
	cur_end date;
	step interval := $3 - '1 day'::interval;
begin
	
	while start_date <= end_date loop
		cur_end := start_date + step;
		if cur_end > end_date then
			result := ROW(start_date, end_date);
		else
			result := ROW(start_date, cur_end);
		end if;
		return next result;
		start_date := cur_end + '1 day'::interval;
	end loop;
return;
end
$$ language plpgsql;


Даже работает :)
Код: sql
1.
select * from foo('01.01.2012', '18.05.2012', '1 week') as f(start_date date, end_date date);
...
Рейтинг: 0 / 0
как в результате получить список дат
    #38043563
Korwin_kor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT trunc(dt,'mm') dt1,
last_day(dt) dt2
FROM (SELECT to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1 dt
FROM dual
CONNECT BY to_date('01-01-2012','dd.mm.yyyy')+LEVEL-1<= to_date('31-12-2012','dd.mm.yyyy'))
GROUP BY trunc(dt,'mm'), last_day(dt)
;
...
Рейтинг: 0 / 0
как в результате получить список дат
    #38043564
Korwin_kor,

да уж, трудные роды у тебя приключились. 9 месяцев тужился, чтобы запостить неработающий в Postgree оракловый говнокод...
...
Рейтинг: 0 / 0
как в результате получить список дат
    #38071692
Guest13213
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДобрый Э - Эх

код то, что надо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как в результате получить список дат
    #39301141
gof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gof
Гость
LeXa NalBatselect generate_series( '01.01.2012'::date, '17.05.2012'::date, '1 month'::interval );

от этого плясать...

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


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