【问题标题】:Presto SQL / Athena: how to return only hours, minutes and seconds, from "interval day to second"Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒
【发布时间】:2020-01-23 11:56:48
【问题描述】:

我有一个查询,它从两个时间戳计算差异并作为结果返回“间隔天到秒”,如下所示:

SELECT (interval '1' second)*(timestamp_1 - timestamp_2) as time_delta

返回的结果如下:

  |  time_delta
--+----------------
  | 0 03:28:47.000
  | 0 02:20:37.000
  | 0 00:55:12.000

etc...

结果的 typeof() 是“间隔天到秒”。

有没有办法只保留时分和秒部分?这样我就会得到类似的东西:

  |  time_delta
--+----------------
  |   03:28:47
  |   02:20:37
  |   00:55:12

或者,至少,删除“天”部分?

提前致谢。

【问题讨论】:

    标签: sql presto amazon-athena


    【解决方案1】:

    Presto 没有格式化interval 值的功能。您的选择:

    castvarchar + regexp_replace:

    presto:default> SELECT regexp_replace(CAST(parse_duration('3789s') AS varchar), '^0 (.*)\.000', '$1');
      _col0
    ----------
     01:03:09
    

    hour()minute()second() 函数+ 连接。 format() 函数大大简化了这一点,但这在 Athena 上尚不可用。

    【讨论】:

    • 我认为最终我会使用一些正则表达式来编辑转换为字符串的结果。谢谢,我会将您的回答标记为已接受。
    • @wtfzambo 请创建一个问题github.com/prestosql/presto/issues,我们也许可以添加一些有用的东西。
    【解决方案2】:

    您应该能够使用 presto 方便功能来获取您返回的时间戳。看起来 presto 支持 MySQL 函数格式,所以你应该可以根据 presto 文档使用date_parse

    类似

    SELECT date_parse((interval '1' second)*(timestamp_1 - timestamp_2), %r) as time_delta
    

    更多信息在这里: https://trino.io/docs/current/functions/datetime.html

    【讨论】:

    • 遗憾的是它不起作用,因为“date_parse”需要一个“varchar”值,而我的列是一个“间隔”。即使将间隔转换为字符串,我也会收到“无效格式”错误,可能是由于 time_delta 的格式设置方式,因为它不完全是日期,而只是持续时间。
    • 这部分查询的目的是什么? interval '1' second 这就是你得到一个间隔的原因。你可以删除它并使用date_diff吗?
    • 是应用的一些点击流数据,timestamp_1和timestamp_2代表单个用户的第一次和最后一次交互。差异告诉我他们花了多少时间。我实际上已经尝试过“date_diff”,但该函数的输出是“bigint”。我从原始查询中得到的结果已经可以了,我只是想通过从中删除“天”和“毫秒”来使其更具可读性。
    • 你传递给 date_diff 的单位是什么?应该能够将分钟传递到日期差异,然后通过除以 60 并使用 mod 60 作为分钟部分来计算小时和分钟。
    • 毫秒,是的,这是我想到的替代解决方案。我只是希望有一个快速的功能可以在一行中为我完成。
    猜你喜欢
    • 2019-11-08
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多