Oracle SQL中计算HHMMSS格式数值时间的时间差问题
解决数值型HHMMSS时间的小时/分钟差值计算问题
直接用RowB-RowA计算时间差值的方式完全错误——它把HHMMSS当成普通数字处理,完全忽略了时间的60进制规则(60秒=1分钟、60分钟=1小时),所以跨小时且分钟数交叉时结果必然不对。
方案1:数据为合法HHMMSS格式(秒、分钟≤59)
先把数值转成标准时间类型,再计算差值:
SELECT RowA, RowB, -- 输出小时:分钟格式的差值(如0:34表示0小时34分) TO_CHAR(FLOOR(time_diff * 24), 'FM9999') || ':' || TO_CHAR(TRUNC((time_diff * 24 * 60) - FLOOR(time_diff * 24)*60), 'FM00') AS hour_minute_diff, -- 单独提取小时差值 FLOOR(time_diff * 24) AS hour_diff, -- 单独提取分钟差值(含小数,如34.5表示34分30秒) (time_diff * 24 * 60) - FLOOR(time_diff * 24)*60 AS minute_diff_exact FROM ( SELECT RowA, RowB, -- 把数值补成6位字符串后转成时间,计算差值(单位:天) TO_DATE(LPAD(RowB, 6, '0'), 'HH24MISS') - TO_DATE(LPAD(RowA, 6, '0'), 'HH24MISS') AS time_diff FROM your_table );
方案2:数据存在非法时间值(秒/分钟超过59)
如果数据里有类似21788(对应02:17:88,秒数超60)这种非法值,需要先修正时间再计算:
SELECT RowA, RowB, TO_CHAR(FLOOR(time_diff * 24), 'FM9999') || ':' || TO_CHAR(TRUNC((time_diff * 24 * 60) - FLOOR(time_diff * 24)*60), 'FM00') AS hour_minute_diff, FLOOR(time_diff * 24) AS hour_diff, (time_diff * 24 * 60) - FLOOR(time_diff * 24)*60 AS minute_diff_exact FROM ( SELECT RowA, RowB, -- 用修正后的时间计算差值 TO_DATE(hh_b || LPAD(mm_b,2,'0') || LPAD(ss_b,2,'0'), 'HH24MISS') - TO_DATE(hh_a || LPAD(mm_a,2,'0') || LPAD(ss_a,2,'0'), 'HH24MISS') AS time_diff FROM ( SELECT RowA, RowB, -- 修正RowA的时间:处理超60的秒/分钟,转成合法的小时/分钟/秒 TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),1,2)) + FLOOR((TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),3,2)) + FLOOR(TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),5,2))/60))/60) AS hh_a, MOD(TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),3,2)) + FLOOR(TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),5,2))/60),60) AS mm_a, MOD(TO_NUMBER(SUBSTR(LPAD(RowA,6,'0'),5,2)),60) AS ss_a, -- 修正RowB的时间 TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),1,2)) + FLOOR((TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),3,2)) + FLOOR(TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),5,2))/60))/60) AS hh_b, MOD(TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),3,2)) + FLOOR(TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),5,2))/60),60) AS mm_b, MOD(TO_NUMBER(SUBSTR(LPAD(RowB,6,'0'),5,2)),60) AS ss_b FROM your_table ) );
说明
LPAD(RowA,6,'0'):把短数值补成6位字符串,比如278变成000278,对应00:02:48- 时间差值以天为单位,乘以24转成小时,乘以24*60转成分钟,再拆分小时和分钟部分
内容的提问来源于stack exchange,提问作者Vijay Kumar
相关产品推荐
相关产品推荐

