完全动态的方法将是基于以下内容的查询generate_series()
:
SELECT the_date::date
FROM generate_series('2013-01-01 0:0'::timestamp
, date_trunc('year', now()::timestamp)
+ interval '1 year - 1 day'
, interval '1 day') the_date;
始终对日期和时间戳使用 ISO 8601 格式,无论区域设置如何。
最终转换为date
( the_date::date
),因为函数返回timestamp
(当输入timestamp
参数时)。
表达方式
date_trunc('year', now()::timestamp) + interval '1 year - 1 day'
计算当年的最后一天。或者,您可以使用EXTRACT (year FROM now())::text || '-12-31')::date
,但这会更慢。
您可以将其包装到自定义“表函数”(又名set-returning 函数)中,您基本上可以将其用作查询中表名的直接替换:
CREATE OR REPLACE FUNCTION f_dates_since_2013()
RETURNS SETOF date AS
$func$
SELECT the_date::date
FROM generate_series('2013-01-01 0:0'::timestamp
, date_trunc('year', now()::timestamp)
+ interval '1 year - 1 day'
, interval '1 day') the_date;
$func$ LANGUAGE sql STABLE;
例子:
SELECT * FROM f_dates_since_2013();
更进一步,您可以创建一个表,或者更优雅地创建一个MATERIALIZED VIEW
基于此函数(或直接底层查询)的表:
CREATE MATERIALIZED VIEW my_dates(the_date) AS
SELECT * FROM f_dates_since_2013();
称呼:
SELECT * FROM my_dates;
您现在所要做的就是安排在每个新年开始时运行的年度 cron 作业:REFRESH MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW my_dates;