Oracle将行复制到具有不同日期的同一个表中
Posted
技术标签:
【中文标题】Oracle将行复制到具有不同日期的同一个表中【英文标题】:Oracle copying rows into same table with different dates 【发布时间】:2021-08-13 13:45:06 【问题描述】:我有一个时间表,日期可以跨越午夜。在示例中,您可以看到 08/23 和 08/24 的日期。
如何将这些行复制到同一个表中但日期不同。 例如 start_date 08/23 的行我想是 08/28。 start_date 08/24 的行应该是第二天 08/29。
注意 start_date=08/23 和 end_date=08/24 的情况
提前感谢所有回答。
Desired output
SCHEDULE_ID LOCATION_ID START_DATE END_DATE
22 1 08232021 23:50:00 08232021 23:54:00
22 1 08232021 23:56:00 08242021 00:02:00
22 2 08242021 00:05:00 08242021 00:09:00
22 1 08282021 23:50:00 08282021 23:54:00
22 1 08282021 23:56:00 08292021 00:02:00
22 2 08292021 00:05:00 08292021 00:09:00
ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
create table schedule(
schedule_id NUMBER(4),
location_id number(4),
start_date DATE,
end_date DATE,
check (start_date=trunc(start_date,'MI')),
check (end_date=trunc(end_date,'MI'))
);
insert into schedule(
schedule_id,
location_id,
start_date,
end_date
)
VALUES (22,1,TO_DATE('2021/08/23 23:50:00', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2021/08/23 23:54:00', 'yyyy/mm/dd hh24:mi:ss'));
insert into schedule(
schedule_id,
location_id,
start_date,
end_date
)
VALUES (22,1,TO_DATE('2021/08/23 23:56:00', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2021/08/24 00:02:00', 'yyyy/mm/dd hh24:mi:ss'));
insert into schedule(
schedule_id,
location_id,
start_date,
end_date
)
VALUES (22,2,TO_DATE('2021/08/24 00:05:00', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE('2021/08/24 00:09:00', 'yyyy/mm/dd hh24:mi:ss'));
【问题讨论】:
【参考方案1】:您这样做是为了生成更多数据,也许是为了测试?
应该是这样的
insert into schedule
select schedule_id, location_id, start_date + 5, end_date + 5
from schedule
;
某些日期间隔跨越午夜的事实是无关紧要的。
【讨论】:
谢谢。抱歉,如果我的帖子具有误导性,但一天可能有多个时间表。我要做的是收集某个日期的所有时间表行,然后只复制它们。我不确定如何处理跨越午夜的时间表,因为我不想复制部分时间表。我需要一些更聪明的东西。也许可以找到 DATE、date+1 的所有行并复制这些行。我在考虑合并,所以我不会得到重复的行。 @Beefstu - 抱歉,我不明白。我提供的解决方案是“复制”all 表中的所有计划和所有日期的行(结果是该表的行数将是原来的两倍)。 “一个日期的所有计划行并且只复制它们”是什么意思? “只”指的是什么?在您的示例中,您展示了复制所有行。 我需要这样的东西,但如果轮班过了午夜,它就不起作用了。也许我会要求一个班次不能跨越午夜 INSERT 插入日程表( schedule_id, location_id, start_date, end_date ), rws 为( select s.*, max (start_date ) over () mx_dt from schedule s ) SELECT * from ( select schedule_id, location_id, start_date + 1, end_date +1 from rws where start_date > trunc ( mx_dt ) );以上是关于Oracle将行复制到具有不同日期的同一个表中的主要内容,如果未能解决你的问题,请参考以下文章
DB2 INSERT INTO SELECT状态将行复制到同一张表中,不允许多行。