0

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

我正在运行 Postgres

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

SELECT * FROM dbo.fof_GetDates('1/1/2013', GETDATE())

但我希望它显示到年底的所有日期。

4

1 回答 1

0

完全动态的方法将是基于以下内容的查询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;
于 2015-06-24T18:37:39.457 回答