Redshift 中的重叠函数

Posted

技术标签:

【中文标题】Redshift 中的重叠函数【英文标题】:Overlaps Function in Redshift 【发布时间】:2017-04-18 19:40:42 【问题描述】:

我正在尝试创建一个真/假标志,当两个日期参数集包含一些重叠的时间或天时,该标志为真。我的理解是 Postgres 已经为此提供了一个名为“OVERLAPS”的函数,如本文档 8.4 所示:

[https://www.postgresql.org/docs/8.4/static/functions-datetime.html][1]

当我尝试在 redshift 中使用 OVERLAPS 时,该功能似乎有效,请参见下面的示例:

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
   (DATE '2001-10-30', DATE '2002-10-30');

但是,当我尝试使用它来填充列时,它会产生错误,请参见下面的示例,其中结果应该始终为真,因为它会将句点与自身进行比较。在此示例中,我使用带时区的时间戳,但我也尝试过不带时区的方法,并且只是日期,所有这些都失败并出现相同的错误。

CREATE TABLE date_table (
  variable  VARCHAR,
  date_start TIMESTAMP WITH TIME ZONE,
  date_end TIMESTAMP WITH TIME ZONE
  )
;
INSERT INTO date_table VALUES ('max_date', TO_TIMESTAMP('2017/04/05 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2017/04/09 00:00:00', 
'YYYY/MM/DD HH24:MI:SS'))
;
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2016/04/06 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2016/04/15 00:00:00', 
'YYYY/MM/DD HH24:MI:SS'))
;
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2015/04/01 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2015/04/14 00:00:00', 
'YYYY/MM/DD HH24:MI:SS'))
;

SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS 
overlap_test
FROM date_table dt

我得到的错误如下:

An error occurred when executing the SQL command:
SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS overlap_test
FROM date_table dt

[Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;

Warnings:
Function ""overlaps"(timestamp without time zone,timestamp without time zone,timestamp without time zone,timestamp without time zone)" not supported.


Execution time: 0.07s
Statement 1 of 1 finished

1 statement failed.

【问题讨论】:

Redshift 基于 Postgres 8.0,因此阅读任何后续版本的手册毫无意义。实际上开始阅读 Postgres 手册是没有意义的,您应该查阅 Redshift 手册:docs.aws.amazon.com/redshift/latest/dg/…(overlaps 似乎根本没有记录在那里) 关于错误:您的第一个示例使用 DATE 值。在您的第二个示例中,您使用的是 TIMESTAMP 值。正如错误消息所说,这显然不受支持 知道了,我的错,这里是 8.0 中列出的链接。 postgresql.org/docs/8.0/static/functions-datetime.html 由于第一个示例返回结果,它显然在 Redshift 中可用,并且 'OVERLAPS' 出现在 redshift 保留列表中:docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html 只是好奇 redshift 似乎没有该函数的其他文档。跨度> @a_horse_with_no_name,正如我提到的,我已经尝试过使用日期和时间戳,在这两种情况下似乎都失败了。 【参考方案1】:

Redshift 基于 Postgres,但它不是 Postgres。查看 Postgres 文档中可用的函数并不是一个好主意,Redshift 中唯一支持的函数是 Redshift 文档中明确列出的函数,在这种情况下仅支持 these date and time functions。不支持 OVERLAPS,因此您会收到警告消息。

我不确定为什么你的第一个 select 语句没有触发这个警告,可能是因为它没有查询任何实际的表。

【讨论】:

这很有帮助,我将停止尝试 Redshift 文档中未列出的功能,谢谢!

以上是关于Redshift 中的重叠函数的主要内容,如果未能解决你的问题,请参考以下文章

Redshift中的Isdate函数

没有函数或存储过程的 Amazon RedShift 中的 Upsert

Redshift 中的 Python UDF 函数始终返回 NULL 值

Redshift 中的 REGEXP_SUBSTR 函数不返回预期值

Redshift JSON 性能

使用 map 函数将数组中的值传递给 redshift 参数化查询