【问题标题】:Cannot parse UTC date in Athena无法在 Athena 中解析 UTC 日期
【发布时间】:2021-03-24 00:35:38
【问题描述】:

我的日期字符串格式为:2019-02-18 09:17:31.260000+00:00,我正在尝试将其转换为 Athena 中的日期。

我已尝试按照 SO 答案中的建议转换为时间戳,但失败了。 https://github.com/prestodb/presto/issues/10567 中有讨论,但没有对这种特定日期格式的回答。

我尝试了几种格式,例如 'YYYY-MM-dd HH:mm:ss.SSSSSSZ',但都不起作用,并出现类似 INVALID_FUNCTION_ARGUMENT: Invalid format:..is malformed at "+00:00" 这样的错误。

卡了一段时间,感谢任何帮助!

【问题讨论】:

    标签: amazon-web-services datetime-format amazon-athena presto trino


    【解决方案1】:

    Athena 是基于一个非常旧的 Presto 版本,并且没有直接的方法可以通过一些字符串操作技巧来做到这一点。例如,您可以使用regexp_replace 提取字符串中与带有时区类型的内置时间戳兼容的部分,然后执行:

    SELECT cast(regexp_replace('2019-02-18 09:17:31.260000+00:00','(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\d{3}(.*)', '$1$2') AS timestamp with time zone)
    

    Trino (formerly known as PrestoSQL) 的最新版本引入了对精度高达纳秒(12 位小数)的可变精度时间类型的支持。

    使用该功能,您可以:

    trino> select cast('2019-02-18 09:17:31.260000+00:00' as timestamp(6) with time zone);
                 _col0
    --------------------------------
     2019-02-18 09:17:31.260000 UTC
    (1 row)
    

    【讨论】:

    • 第一个有效 :) +1 非常感谢!然而,第二个导致错误:不匹配的输入 'with' Expecting {')', 'array'} with status code 400.. 也许就像你说的基于旧版本 Presto 的 Athena 不支持它。
    【解决方案2】:

    Martin Traverso 的答案的较短版本是将多余的字符子串起来:

    select cast(substr('2019-02-18 09:17:31.260000+00:00',1,23) as timestamp);
    

    【讨论】:

    • 感谢这种方法!是的,它更短,更易读。
    • 这只有在你不关心时区的情况下才有效。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多