Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как в результате получить список дат / 10 сообщений из 10, страница 1 из 1
21.02.2012, 10:40
    #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
21.02.2012, 11:52
    #37671963
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как в результате получить список дат
PG81,

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

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

Интерисует есть ли другие варианты?
...
Рейтинг: 0 / 0
21.02.2012, 14:04
    #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
21.02.2012, 17:27
    #37672992
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как в результате получить список дат
select generate_series( '01.01.2012'::date, '17.05.2012'::date, '1 month'::interval );

от этого плясать...
...
Рейтинг: 0 / 0
22.02.2012, 00:06
    #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
19.11.2012, 04:15
    #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
19.11.2012, 04:44
    #38043564
как в результате получить список дат
Korwin_kor,

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

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

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

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


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