[英]Dynamic Date Table
我正在PowerPivot中创建数据模型,并且想知道是否仍然可以在SQL中创建动态日期表。 我可以在PowerQuery中创建一个表,但是在PowerPivot中修改表时,PowerQuery(只读连接)中存在一些错误。 我正在寻找的是一个开始日期为2013年1月1日(间隔为天),并且随着每个新年滚动,行都将添加到日期表中。 反正有这样做吗?
我正在运行Postgres
到目前为止,我想到了这个,
SELECT * FROM dbo.fof_GetDates('1/1/2013', GETDATE())
但我希望它显示到年底为止的所有日期。
完全动态的方法是基于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
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.