Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒

Posted

技术标签:

【中文标题】Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒【英文标题】:Presto SQL / Athena: how to return only hours, minutes and seconds, from "interval day to second" 【发布时间】: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

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

提前致谢。

【问题讨论】:

【参考方案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 作为分钟部分来计算小时和分钟。 毫秒,是的,这是我想到的替代解决方案。我只是希望有一个快速的功能可以在一行中为我完成。

以上是关于Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒的主要内容,如果未能解决你的问题,请参考以下文章

Athena (Presto) SQL 窗口函数

AWS Athena (Presto) - 如何将时间戳格式化为日期格式?

AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?

Presto SQL / Athena:在不同日期的时间之间进行选择

根据 SQL 或 Presto Athena 中的某一行中的某个值过滤列

AWS Athena [Presto] 如何仅接收过去 7 天的数据?