如何在Google Data Studio中计算PM到AM跨次日的小时时长
问题根因
原有公式的逻辑是将起止12小时制时间转换为当日0点对应的总秒数后直接相减,跨天场景下结束时间的当日秒数会小于开始时间,得到负值结果,无法输出正确时长。
调整方案
对计算得到的秒数差取模86400(1天的总秒数),当差值为负时,取模运算会自动叠加1天的秒数,得到正确的跨天时长,再根据需求转换为小时/分钟单位即可。
调整后完整公式
输出秒级时长
MOD( ((CAST(REGEXP_EXTRACT(End Time,"^(\\d+):")AS NUMBER)*60*60) + (CAST(REGEXP_EXTRACT(End Time,"^\\d+:(\\d+)")AS NUMBER)*60) + NARY_MAX(CAST(REGEXP_REPLACE(End Time,".*(PM)$","43200")AS NUMBER),0)) - ((CAST(REGEXP_EXTRACT(Start Time,"^(\\d+):")AS NUMBER)*60*60) + (CAST(REGEXP_EXTRACT(Start Time,"^\\d+:(\\d+)")AS NUMBER)*60) + NARY_MAX(CAST(REGEXP_REPLACE(Start Time,".*(PM)$","43200")AS NUMBER),0)), 86400 )
输出小时级时长
在秒级公式基础上除以3600即可:
MOD( ((CAST(REGEXP_EXTRACT(End Time,"^(\\d+):")AS NUMBER)*60*60) + (CAST(REGEXP_EXTRACT(End Time,"^\\d+:(\\d+)")AS NUMBER)*60) + NARY_MAX(CAST(REGEXP_REPLACE(End Time,".*(PM)$","43200")AS NUMBER),0)) - ((CAST(REGEXP_EXTRACT(Start Time,"^(\\d+):")AS NUMBER)*60*60) + (CAST(REGEXP_EXTRACT(Start Time,"^\\d+:(\\d+)")AS NUMBER)*60) + NARY_MAX(CAST(REGEXP_REPLACE(Start Time,".*(PM)$","43200")AS NUMBER),0)), 86400 )/3600
注意事项
- 该方案仅支持跨1天的时长计算,如果你的业务存在跨2天及以上的场景,需要在Google Sheets中补充存储起止时间对应的日期字段,结合日期计算总差值,仅用时间字段无法判断跨天天数。
- 请确保你的
End Time和Start Time字段格式统一为带AM/PM标识的12小时制时间,避免正则提取出错。
内容的提问来源于stack exchange,提问作者Eyyy
相关产品推荐
相关产品推荐

