我正在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
但我希望它能显示截至年底的所有日期。
答案 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;