动态日期表

时间:2015-06-24 14:40:15

标签: sql postgresql date powerpivot generate-series

我正在PowerPivot中创建一个数据模型,我想知道是否有可以在SQL中创建动态日期表。我能够在PowerQuery中创建一个,但是当在PowerPivot中修改表时,PowerQuery(只读连接)中存在一些错误。我正在寻找的是开始日期为2013年1月1日(间隔为天),并且每个新年滚动的行都会添加到日期表中。反正有没有这样做?

我正在运行Postgres

到目前为止,我想出了这个,

A.Where(B.Distinct().ToDictionary(_ => _).ContainsKey).Count(); //This should work for other scenario with good performance

但我希望它能显示截至年底的所有日期。

1 个答案:

答案 0 :(得分:0)

完全动态方法是基于generate_series()的查询:

%f
  • 始终将ISO 8601格式用于日期和时间戳,无论语言环境设置如何,都可以使用。

  • 最终演员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; date),因为该函数返回the_date::date(当有timestamp个参数时)。

  • 表达式

    timestamp

    计算当前年份的最后一天。或者,您可以使用date_trunc('year', now()::timestamp) + interval '1 year - 1 day' ,但速度较慢。

您可以将其包装为自定义“table-function”(又名设置返回函数),您基本上可以将其用作表名的替代品在查询中:

EXTRACT (year FROM now())::text || '-12-31')::date

示例:

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;

更进一步,您可以创建一个表格,或者 - 更优雅地 - 基于此函数创建MATERIALIZED VIEW(或直接查询基础查询):

SELECT * FROM f_dates_since_2013();

呼叫:

CREATE MATERIALIZED VIEW my_dates(the_date) AS
SELECT * FROM f_dates_since_2013();

您现在要做的就是安排在每个新年开始时运行REFRESH MATERIALIZED VIEW年度cron作业

SELECT * FROM my_dates;