Oracle SQL中如何按预约时长将单条时间区间记录拆分为多行
实现方案
核心思路
- 利用Oracle层级查询
CONNECT BY生成对应拆分条数的序列,序列长度由总时长Duration除以单条预约时长Duration_Appointment得到 - 每条拆分记录的起始时间为原始起始时间叠加「序列序号-1」倍的单条预约时长,结束时间为当前起始时间叠加单条预约时长
- 其他固定字段(id、总时长、单条预约时长)直接复用原始数据即可
完整SQL示例
WITH original_data AS ( -- 此处可替换为你的实际业务表,以下为模拟测试数据 SELECT 193229 AS id, TO_DATE('07/09/2021 13:30:00', 'DD/MM/YYYY HH24:MI:SS') AS datetimeFrom, TO_DATE('07/09/2021 17:00:00', 'DD/MM/YYYY HH24:MI:SS') AS datetimeTo, 210 AS Duration, 15 AS Duration_Appointment FROM DUAL ) SELECT t.id, -- 如需输出字符串格式日期,可外层包TO_CHAR:TO_CHAR(日期运算, 'DD/MM/YYYY HH24:MI:SS') t.datetimeFrom + (LEVEL - 1) * t.Duration_Appointment / 1440 AS datetimeFrom, t.datetimeFrom + LEVEL * t.Duration_Appointment / 1440 AS datetimeTo, t.Duration || '(min)' AS Duration, t.Duration_Appointment || '(min)' AS Duration_Appointment FROM original_data t CONNECT BY LEVEL <= t.Duration / t.Duration_Appointment -- 多id场景下需加以下两个条件避免数据交叉、循环报错 AND PRIOR t.id = t.id AND PRIOR SYS_GUID() IS NOT NULL ORDER BY id, datetimeFrom;
补充说明
Oracle中日期运算默认单位为天,15分钟换算为天的计算逻辑为
15/1440(1天=1440分钟)
若你的原始datetimeFrom、datetimeTo字段为字符串类型,需要先通过TO_DATE转换为日期类型再做运算,输出时可按需用TO_CHAR转回指定格式的字符串
内容的提问来源于stack exchange,提问作者Ezz
相关产品推荐
相关产品推荐

