日期生成器

来自 PostgreSQL 维基
跳转到导航跳转到搜索

代码片段

日期序列生成器

适用于 PostgreSQL

任何版本

编写语言

SQL

依赖

作者 Scott Bailey 'Artacus'

在处理调度应用程序时,拥有日期关系(日期表)几乎是必不可少的。但是,有人质疑我为什么将它物化,因为 Postgres 可以使用返回集函数动态生成它。

一些测试表明,动态生成它与从磁盘读取的性能一样好,即使我过滤的所有部分都被分解并建立了索引。

CREATE OR REPLACE FUNCTION generate_dates(
   dt1  date,
   dt2  date,
   n    int
) RETURNS SETOF date AS
$$
  SELECT $1 + i
  FROM generate_series(0, $2 - $1, $3) i;
$$ LANGUAGE sql IMMUTABLE;

用法

-- Select even days in odd months
SELECT dt, to_char(dt, 'FMDAY, DD MON YYYY') 
FROM generate_dates('2009-01-01', '2009-12-31', 1) dt
WHERE MOD(EXTRACT(MONTH FROM dt)::int,2) = 1 AND MOD(EXTRACT(DAY FROM dt)::int,2) = 0;

注意

PostgreSQL 8.4 提供了一个 generate_series(timestamptz, timestamptz, interval) 函数,它返回一个 timestamptz 集。