DATETIME_ADD不支持TIME对象,如何将TIME时分秒添加至DATETIME?
嘿,这个问题我之前处理BigQuery时间计算的时候刚好碰到过,给你几个实用又优雅的解决方案:
最优雅的方案:将TIME转换为INTERVAL直接相加
BigQuery其实支持把TIME类型直接转换为INTERVAL(这个INTERVAL就代表对应的时、分、秒时长),然后直接用DATETIME_ADD相加,代码简洁到不行:
SELECT DATETIME_ADD( your_start_datetime, CAST(your_duration_time AS INTERVAL) ) AS final_datetime FROM your_dataset.your_table;
这个方法完全利用内置的类型转换能力,代码易读性拉满,既不用手动计算时分秒的总和,也避免了字符串拼接可能踩的格式坑。
备选方案1:手动计算总秒数相加
如果因为特殊场景不能用INTERVAL转换(比如兼容旧版本需求),可以通过EXTRACT函数拆分TIME的时、分、秒,算出总秒数后再用DATETIME_ADD添加:
SELECT DATETIME_ADD( your_start_datetime, INTERVAL ( EXTRACT(HOUR FROM your_duration_time) * 3600 + EXTRACT(MINUTE FROM your_duration_time) * 60 + EXTRACT(SECOND FROM your_duration_time) ) SECOND ) AS final_datetime FROM your_dataset.your_table;
这个方法逻辑非常清晰,适合需要明确展示时长计算过程的场景,而且还能完美处理TIME中带小数秒的情况(比如01:02:03.456这种)。
备选方案2:字符串拼接后解析
另一种直观的思路是把DATETIME的日期部分和TIME的时分秒部分拼接成完整的时间字符串,再用PARSE_DATETIME解析成DATETIME对象:
SELECT PARSE_DATETIME( "%Y-%m-%d %H:%M:%E*S", FORMAT_DATETIME("%Y-%m-%d", your_start_datetime) || " " || FORMAT_TIME("%H:%M:%E*S", your_duration_time) ) AS final_datetime FROM your_dataset.your_table;
这个方法就像我们手动拼接时间一样好理解,但要注意格式字符串的匹配(比如%E*S是用来处理小数秒的),避免因为格式不匹配导致解析失败。
内容的提问来源于stack exchange,提问作者Deviling Master
相关产品推荐
相关产品推荐

