在查找日期范围时,是否也要让generate_series
返回开始日期和结束日期?
select
'2014-06-05 00:00:00'::timestamp + ('1 month'::INTERVAL * s.a) AS date
from
generate_series(1, cast(extract(month from age('2014-09-05'::date, '2014-06-05'::date)) AS integer), 1) as s(a);
给出此输出
date
2014-07-05 00:00:00
2014-08-05 00:00:00
2014-09-05 00:00:00
这很好,但是我想要
start_date end_date date
2014-06-05 2014-09-05 2014-07-05 00:00:00
2014-06-05 2014-09-05 2014-08-05 00:00:00
2014-06-05 2014-09-05 2014-09-05 00:00:00
原因是我正在从另一个表中提取多个开始/结束对,但无法找到将它们连接在一起的方法。我还使用PostgeSQL版本8.2.15(因此使用了更复杂的generate_series
函数)。
为了将其扩展到我的主要问题,我有一个包含这些开始和结束时间对的表。
start_date end_date
2014-08-25 00:00:00 2014-09-25 00:00:00
2014-05-16 00:00:00 2014-08-16 00:00:00
2014-09-09 00:00:00 2014-12-09 00:00:00
2014-06-05 00:00:00 2014-07-05 00:00:00
2014-05-19 00:00:00 2014-08-19 00:00:00
2014-05-15 00:00:00 2014-07-15 00:00:00
2014-09-04 00:00:00 2014-11-04 00:00:00
如何遍历此表并将其与扩展的日期范围连接起来?
考虑升级到当前版本。Postgres 8.2早已死亡并被遗忘。
对于Postgres 8.2(或更高版本,但现代Postgres中有更优雅的解决方案)。
假设这是关于日期的所有,而不是时间戳。
提供start_date
和end_date
一次:
SELECT start_date, end_date
, (start_date + interval '1 month'
* generate_series(1, months))::date AS the_date
FROM (
SELECT extract(month from age(end_date, start_date))::int AS months
, start_date, end_date
FROM (SELECT '2014-06-05'::date AS start_date
, '2014-09-05'::date AS end_date
) data
) sub;
使用列名the_date
而不是不应用作标识符的date
。
从表t
中提取值:
SELECT start_date, end_date
,(start_date + interval '1 month'
* generate_series(1, months))::date AS the_date
FROM (SELECT *, extract(month FROM age(end_date, start_date))::int AS months
FROM t) sub;
无子查询
SELECT t_id, start_date, end_date
,(start_date + interval '1 month'
* generate_series(1, extract(month from age(end_date
, start_date))::int)
)::date AS the_date
FROM t;
Postgres 8.3的SQL Fiddle。