3

我有一个包含name, location,start_date和的表end_date。我希望将这些包含日期范围的行转换为离散日期的行,同时保持相应的行信息完整。

例子:

Name1, Location1, 2015-4-01, 2015-4-04

变成:

Name1, Location1, 2015-4-01
Name1, Location1, 2015-4-02
Name1, Location1, 2015-4-03
Name1, Location1, 2015-4-04

我想我需要使用 PostgreSQL 函数将其创建为一个新表。

4

2 回答 2

3

创建一个包含三个必需列的新表:

CREATE TABLE new_tbl (
  nam    varchar,
  loc    varchar,
  dt     date);

由于您希望新表中的记录在该范围内start_date-end_date以天为间隔,包括在内,最简单的解决方案是从您的日期生成一个集合:

generate_series(start_date::timestamp, end_date::timestamp, '1 day')

您可以简单地INSERT在新表上添加一条语句:

INSERT INTO new_tbl
  SELECT nam, loc, generate_series(start_date::timestamp, end_date::timestamp, '1 day')::date
  FROM old_tbl;

由于该generate_series函数使用timestamp参数,因此您需要显式转换您date的 s,然后将生成timestamp的 s 转换回dates 以匹配您的列定义。

于 2015-05-03T02:51:04.573 回答
3

在现代 Postgres (9.3+) 中,最好LATERAL在列表的连接中使用 set-returning 函数FROM

假设start_dateend_date被定义NOT NULL

CREATE TABLE AS
SELECT name, location, day::date
FROM   tbl, generate_series(start_date, end_date, interval '1 day') day;

LATERAL在这里是隐含的。
关于子查询的手册LATERAL

一些相关的答案(有很多):

关于LATERAL(回复评论):

于 2015-05-03T03:44:45.607 回答