简要概述:
SELECT CAST(From_iso8601_timestamp('2018-01-01T15:00:00Z') AS timestamp) as "real_date"
全文:
不幸的是,Athena并不完全支持所有Presto功能,它有限制并且在技术上比Presto落后了几个版本。虽然有一些尝试让Athena与AWS Glue Metastore密切集成,但由于基于Hive的metastore存在一些不一致性,因此存在问题。我希望Spark、Hive、Glue、Athena、Presto等都能使用相同的metastore,这将使生活变得更加容易,但回到您的问题:
这篇关于较旧版本的teradata Presto分支的文档提到了Presto中时间戳的一些问题:
Presto声明具有/不具有时区的时间戳的方法不符合SQL标准。在Presto中,两者都使用单词TIMESTAMP声明,例如TIMESTAMP '2003-12-10 10:32:02.1212'或TIMESTAMP '2003-12-10 10:32:02.1212 UTC'。根据是否在时间戳的末尾包含时区来确定时间戳是否具有时区。在其他系统中,时间戳显式声明为带时区的时间戳或不带时区的时间戳。
从Athena分叉出来的Presto版本支持timestamp
和timestamp with timezone
,但是由于teradata文档提到的这个怪癖应该不是问题。真正的问题在于Athena不支持具有时区的时间戳。
您链接的presto文档显示该函数返回不支持的类型timestamp with timezone
,因此您需要将其转换为其他受支持的类型。Athena允许使用不支持的函数和转换到不支持的数据类型是一个疏忽,希望能够解决,但目前必须绕过它。
您需要做的是在该函数调用周围使用CAST()
函数,将类型从timestamp with time zone
更改为timestamp
不幸的是,您可能无法直接将字符串转换为时间戳,尽管这取决于字符串的格式。您也不能使用以timestamp
编写字符串的转换样式,例如无法执行timestamp '2018-01-01 15:00:00'
,原因如下所述。
from_iso1601_timestamp()
函数返回的类型
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT From_iso8601_timestamp('2018-01-01T15:00:00Z') as "real_date"
)
带有时区的时间戳
这样不行
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT CAST('2018-01-01T15:00:00Z' AS timestamp) as "real_date"
)
SQL错误[FAILED]: INVALID_CAST_ARGUMENT: 无法将值转换为时间戳
这种类型的转换也会返回带有时区的时间戳 :(
请注意,此SELECT部分有效,并显示它是timestamp
,但出于某些内部不一致原因,您无法创建视图,您将收到一个错误。
CREATE OR replace VIEW test
AS
SELECT typeof( "real_date" ) AS real_date_type
FROM
(
SELECT timestamp '2018-01-01 15:00:00' as "real_date"
)
SQL错误[FAILED]:无法初始化类com.facebook.presto.util.DateTimeZoneIndex
由于某些原因,在解析select中的值时创建视图需要java类,但是解析值不需要。这是一个应该解决的bug。
这可行!
CREATE OR REPLACE VIEW test
AS
SELECT typeof("real_date") AS real_date_type
FROM
(
SELECT CAST(From_iso8601_timestamp('2018-01-01T15:00:00Z') AS timestamp) as "real_date"
)