生成带有日期和小时的时间序列并在 Amazon Redshift 中创建表

Posted

技术标签:

【中文标题】生成带有日期和小时的时间序列并在 Amazon Redshift 中创建表【英文标题】:Generate time series with date and hour and create table in Amazon Redshift 【发布时间】:2018-09-23 23:31:26 【问题描述】:

我想在 Amazon Redshift 中生成日期和小时表。以下查询适用于 Postgresql 9.1 及更高版本,但不幸的是,我们仅限于 Amazon Redshift,这会导致错误:“函数 generate_series 不存在”。非常感谢您帮助在 8.02 中生成时间序列(如结果表)。

SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, 
                          '2008-03-04 12:00', '10 hours');
  generate_series   

generate_series   
    ---------------------
     2008-03-01 00:00:00
     2008-03-01 10:00:00
     2008-03-01 20:00:00
     2008-03-02 06:00:00
     2008-03-02 16:00:00
     2008-03-03 02:00:00
     2008-03-03 12:00:00
     2008-03-03 22:00:00
     2008-03-04 08:00:00

编辑: 我能够使用以下代码生成我想要的时间序列,但无法将它们创建到 Redshift 中的表中。错误消息是:

“Redshift 表不支持指定的类型或函数(每条 INFO 消息一个)。”

SELECT '2017-01-01 00:00:00'::timestamp + x * interval'1 hour' AS Date_Time
FROM generate_series(0, 1000 * 24) AS g(x)

任何想法如何将其创建到 Redshift 中的表中?谢谢。

【问题讨论】:

不要用 PostgreSQL 8.0 开发新东西 请不要使用这个版本! 抱歉,我忘了提到我们正在使用不支持 generate_series 的 Amazon Redshift 创建表。 i686-pc-linux-gnu 上的 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.3906 编译。 Using sql function generate_series() in redshift的可能重复 silota.com/docs/recipes/… 【参考方案1】:

这样的脚本可能会对您有所帮助,

CREATE or REPLACE function gen_ser() returns integer
as 
$body$
declare
query varchar;
i integer := 0;
begin
loop 
exit when i >= 100;
i:=i+10;
query :='Insert into table select ''01-01-2018''::timestamptz + '''|| i ||' hours'' ::interval;';
execute query;
end loop;
return 1;
end;
$body$
language plpgsql;

【讨论】:

【参考方案2】:

免责声明:请不要再使用此版本!


适用于 Postgres 8.4(无法检查 8.0,但应该也可以)

demo: db<>fiddle

SELECT start_date + gs * interval '10 hours'
FROM (
    SELECT '2008-03-01 00:00:00'::timestamp as start_date, generate_series(1,10, 1) as gs
) s
    generate_series 从 1 到 10 并根据您的起始时间戳加入结果。结果是一个包含两列的表格:一列从每一行开始,一列包含从 1 到 10 的数字。 现在您可以将生成的数字乘以您的区间并将其添加到开头。

编辑: The problem is discussed already

【讨论】:

@LeoJones 这对你有用吗? generate_series 应该适用于整数范围(即使不适用于日期范围)IIRC。 谢谢,S 人。我得到了查询,但无法在 Redshift 中创建一个表(请参阅编辑)。 @LeoJones 请描述您尝试创建表的内容。 @LeoJones 在 *** 上创建第二个问题会更好,因为不允许在一个线程中提出不同的问题。如果它解决了您的起源问题,请投票/接受它并发布一个新问题(也许指的是这个)

以上是关于生成带有日期和小时的时间序列并在 Amazon Redshift 中创建表的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito:生成令牌并在使用 amazon-cognito-identity-js SDK 刷新后

如何使用不同日期自定义周末日期,并在完整日历中使用不同的小时数

MySQL格式化日期参数

根据 R 中的日期和小时以 15 分钟的间隔聚合数据

使用 PHP MYSQL 生成月度日期和小时报表

Amazon Redshift:公共假期表的重复日期