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
值的功能。您的选择:
cast
到 varchar
+ 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:如何从“间隔天到秒”只返回小时、分钟和秒的主要内容,如果未能解决你的问题,请参考以下文章
AWS Athena (Presto) - 如何将时间戳格式化为日期格式?
AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?
Presto SQL / Athena:在不同日期的时间之间进行选择