背景有些业务场景,需要计算2个日期之间的差值,但是这个日期字段是不完整的,只有时分秒部分,比如 10:10:03 AM - 10:32:07 AM = -00:22:04,想得到这个结果,该如何计算呢?此时需要结合spark文本、日期和时间、字符串等函数共同处理,接下来介绍具体步骤。 1 年月日补全,计算时间差秒数新建字段补全年月日并计算秒差, SECONDDIFF(current_date()||" "||"10:10:03",current_date()||" "||"10:32:07") 公式里的时分秒替换为需要参与计算的文本字段,结果是一个数值 2 分解时间差并格式化2.1 将时间差秒数通过数学运算分别转换为小时、分钟、秒对应的整数值得到小时数(取整):floor(abs([秒差]/3600)) 得到分钟数(取整):floor(abs([秒差]%3600)/60) 得到秒数(取整):abs([秒差]%60) 2.2 格式化根据时间差秒数的正负情况,使用case when语句在格式化字符串前添加相应的正负号(如果小于 0 则添加-,否则为空字符串)。 然后,对于小时、分钟、秒这些数值,使用lpad函数进行补零操作,确保它们都以两位数字的形式呈现(例如,数字 5 会被补零为05), 再通过concat_ws函数按照:作为分隔符将各部分拼接起来,从而得到类似-00:22:04这样符合要求的格式化字符串。
case when [秒差] < 0 then '-' else '' end||concat_ws(':', lpad([时], 2, '0'), lpad([分], 2, '0'), lpad([秒], 2, '0')) 相关文档参考: (1)Spark SQL文本函数及应用 https://docs.guandata.com/article/1/428146476024070144.html (2)函数清单 https://docs.guandata.com/article/1/575217989738037248.html (3)Spark 日期函数及应用 https://docs.guandata.com/article/1/428146642139480064.html |