【问题标题】:Split datetime over several rows in Oracle SQL在 Oracle SQL 中将日期时间拆分为多行
【发布时间】:2021-10-20 07:16:37
【问题描述】:

我有以下数据集:

|id|       datetimeFrom|        datetimeTo|         Duration|      Duration_Appointment
|193229|  07/09/2021 13:30:00  07/09/2021 17:00:00  210(min)       15(min)

我需要做的是将预约计数(14 次预约)拆分为多条记录 所以结果必须是这样的:

|id|       datetimeFrom|        datetimeTo|         Duration|      Duration_Appointment
|193229|  07/09/2021 13:30:00  07/09/2021 13:45:00  210(min)       15(min)
|193229|  07/09/2021 13:45:00  07/09/2021 14:00:00  210(min)       15(min)
|193229|  07/09/2021 14:00:00  07/09/2021 14:15:00  210(min)       15(min)  
.....

【问题讨论】:

标签: sql oracle loops plsql data-manipulation


【解决方案1】:

我相信这个查询应该适合你。当您的源表中有多个记录时,链接查询中的层次结构可能会导致您出现问题:

WITH test_data (ID, datetimefrom, datetimeto, duration, duration_appointment) AS
(
  SELECT 193229, TO_DATE('07/09/2021 13:30:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('07/09/2021 17:00:00', 'MM/DD/YYYY HH24:MI:SS'), 210, 15 FROM DUAL UNION ALL
  SELECT 122221, TO_DATE('05/06/2021 11:30:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('05/06/2021 14:30:00', 'MM/DD/YYYY HH24:MI:SS'), 180, 20 FROM DUAL
),
appointment_slots (ID, datetimeFrom, datetimeTo, lvl, duration_min) AS
(
  SELECT td.id, td.dateTimeFrom, td.dateTimeFrom+(td.duration_appointment*(1/24/60)), td.duration/td.duration_appointment, td.duration_appointment
  FROM test_data td
  UNION ALL
  SELECT a.id, a.dateTimeTo, a.dateTimeTo+(a.duration_min*(1/24/60)), a.lvl-1, a.duration_min
  FROM appointment_slots a
  WHERE lvl > 1
)
SELECT a.id, a.datetimefrom, a.datetimeto, a.duration_min
FROM appointment_slots a
ORDER BY a.ID, a.datetimefrom;

【讨论】:

  • 是的,这对我有用。非常感谢
猜你喜欢
  • 2021-02-16
  • 2021-10-10
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多