Presto(AWS Athena)毫秒转HH:MM:SS/MM:SS格式报错如何解决
错误原因
报错核心是date_format函数的入参不符合Presto(AWS Athena底层基于Presto引擎)的要求:date_format仅支持timestamp/timestamp with time zone类型作为第一个入参,你代码中传入的是time类型,因此触发参数不匹配错误。
另外你最初版本的SQL还存在语法问题:case分支中直接用逗号分隔时间值和格式串的写法不符合SQL规范,调整后使用date_format的版本已经修复了该问题,仅需补充类型转换即可正常运行。
正确实现方案
下面两种方案都可以实现毫秒值转HH:MM:SS/MM:SS格式的需求:
方案1:转换time类型为timestamp后调用date_format
仅需要给你原有逻辑生成的time值套一层cast(xxx as timestamp)即可,修改后的代码段如下:
(case when milliseconds/1000 < 60 * 60 then date_format(cast(time '00:00:00' + milliseconds * interval '1' second as timestamp), '%i:%s') else date_format(cast(time '00:00:00' + milliseconds * interval '1' second as timestamp), '%H:%i:%s') end) as hhmmss
方案2:直接基于秒数格式化的简化写法
你也可以跳过time类型计算,直接把毫秒转成总秒数后格式化,逻辑更简洁:
(case when floor(milliseconds / 1000) < 3600 then date_format(date_parse(cast(floor(milliseconds / 1000) as varchar), '%s'), '%i:%s') else date_format(date_parse(cast(floor(milliseconds / 1000) as varchar), '%s'), '%H:%i:%s') end) as hhmmss
内容的提问来源于stack exchange,提问作者Zole72
相关产品推荐
相关产品推荐

