Presto报错无法将interval day to second转换为double的解决方法
问题背景
数据表包含interval day to second类型列_range,需要将其作为除数,和double类型列_count做除法运算,直接执行触发报错:
Cannot apply operator: double / interval day to second
尝试通过cast(_range as double)将间隔列转为double类型后计算,再次触发报错:
Cannot cast interval day to second to double
解决方法
核心原因是interval类型是带时间单位的时长值,不是无量纲的纯数字,既不支持直接和数值类型做算术运算,也不支持直接强转为double类型。必须先按照业务需要的时间口径,把间隔值换算成对应单位的纯数值,再执行除法。
通用换算逻辑是提取间隔对应的总秒数(double类型),再根据业务需要换算成其他时间单位即可,主流引擎的写法如下:
- Trino/Presto、PostgreSQL等支持标准SQL extract函数的引擎,直接用
extract(epoch from 间隔列)就能拿到间隔对应的总秒数(浮点型):
-- 计算每秒对应的_count值 SELECT _count / EXTRACT(epoch FROM _range) FROM your_table; -- 计算每天对应的_count值(1天=86400秒) SELECT _count / (EXTRACT(epoch FROM _range) / 86400.0) FROM your_table; -- 计算每小时对应的_count值(1小时=3600秒) SELECT _count / (EXTRACT(epoch FROM _range) / 3600.0) FROM your_table;
Trino/Presto也可以用内置便捷函数直接转指定单位数值,调用对应函数拿到数值后做除法即可:
to_milliseconds(_range):返回间隔对应的总毫秒数(bigint类型)to_seconds(_range):返回间隔对应的总秒数(double类型)to_minutes(_range):返回间隔对应的总分钟数(double类型)to_hours(_range):返回间隔对应的总小时数(double类型)to_days(_range):返回间隔对应的总天数(bigint类型)
按小时计算的写法可以简化为:
SELECT _count / to_hours(_range) FROM your_table;
换算前需确认业务统计的时间粒度,选错单位会导致最终计算结果量级错误。
内容的提问来源于stack exchange,提问作者ebergeson
相关产品推荐
相关产品推荐

