簡體   English   中英

動態日期表

[英]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格式,無論區域設置如何,都可以使用。

  • 最終轉換為datethe_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM