Redshift存储时长字段并转换为秒的技术问题咨询
Redshift时长类数据存储与转换方案
1. 原始时长数据存储类型建议
你给出的时长格式(含天的d.hh:mm:ss.fffffff和不含天的hh:mm:ss)不属于Redshift INTERVAL类型默认支持的标准格式,直接存入INTERVAL会触发解析错误。如果需要完整保留原始字符串内容,建议选用 VARCHAR(20) 类型:
- 按照最长可能的格式计算(5位天数+小数点+时分秒+7位微秒),20个字符长度完全覆盖所有可能的取值,不会造成空间浪费
- 不会改变API返回的原始内容,方便后续溯源校验
2. 时长转秒实现方案与秒值字段类型
转换逻辑
可以通过Redshift内置的字符串拆分函数实现格式转换,兼容两种时长格式的SQL实现如下:
WITH duration_split AS ( SELECT original_duration, -- 拆分天部分,无天则默认0 CASE WHEN strpos(original_duration, '.') > 0 THEN split_part(original_duration, '.', 1)::BIGINT ELSE 0 END AS days, -- 提取时分秒部分 CASE WHEN strpos(original_duration, '.') > 0 THEN split_part(original_duration, '.', 2) ELSE original_duration END AS hms_part FROM your_table ) SELECT original_duration, -- 计算总秒数:天*86400 + 时*3600 + 分*60 + 秒 days * 86400 + split_part(hms_part, ':', 1)::INT * 3600 + split_part(hms_part, ':', 2)::INT * 60 + split_part(hms_part, ':', 3)::FLOAT AS duration_seconds FROM duration_split;
秒值字段类型建议
- 如果需要保留微秒级精度,且对数值准确性要求高,建议选用
NUMERIC(18,6)类型,避免浮点运算误差 - 如果对精度要求不高,仅需要近似值,可选用
FLOAT类型 - 如果不需要小数部分,仅保留整数秒,直接选用
INT类型即可,单字段可覆盖最长约68年的时长取值,完全满足车辆行驶时长的存储需求
内容的提问来源于stack exchange,提问作者As R
相关产品推荐
相关产品推荐

