SQL 匹配持续时间 (fromDatetime- toDatetime)

SQL Matching Time durations (fromDatetime- toDatetime)

我有 2 table

Table一个

... StartTime EndTime
... 2021.01.01 7:15:00 2021.01.01 9:30:00

Table B

... StartTime EndTime
... 2021.01.01 6:10:00 2021.01.01 6:30:00
... 2021.01.01 7:00:00 2021.01.01 7:32:00
... 2021.01.01 7:45:00 2021.01.01 9:15:00

从tableA开始,我想根据tableB的时间拆分数据。 table B 中的时间是要使用的正确时间间隔。

举个例子说明我的意思 结果应该是:

... StartTime EndTime
... 2021.01.01 7:15:00 (from A) 2021.01.01 7:32:00 (from B)
... 2021.01.01 7:45:00 (from B) 2021.01.01 9:15:00 (from B)
create table #A (
    StartTime datetime
    , EndTime datetime
);

create table #B (
    StartTime datetime
    , EndTime datetime
);

insert into #A
select {ts'2021-01-01 07:15:00'}, {ts'2021-01-01 09:30:00'}

insert into #B
select {ts'2021-01-01 06:10:00'}, {ts'2021-01-01 06:30:00'}
insert into #B
select {ts'2021-01-01 07:00:00'}, {ts'2021-01-01 07:32:00'}
insert into #B
select {ts'2021-01-01 07:45:00'}, {ts'2021-01-01 09:15:00'}


Drop Table #A, #B

我会在 A 上加入 B,然后使用 row_number 进行排序:

select 
     A.StartTime as OriginalStartTime
    ,A.EndTime as OriginalStartTime
    ,row_number() over (order by B.StartTime) as portion
    ,B.StartTime as PortionStartTime
    ,B.EndTime as PortionEndTime
from
    TableA as as
    inner join TableB as B on B.StartTime>=A.StartTime and B.EndTime<=A.EndTime
order by 3 asc

首先,在两个范围重叠的地方加入 BA(即,一个范围的某些部分与另一个范围的某些部分重叠)。找到重叠的行后,如有必要,限制 B 的开始和结束日期:

SELECT
    CASE WHEN a.StartTime > b.StartTime THEN a.StartTime ELSE b.StartTime END AS s,
    CASE WHEN a.EndTime   < b.EndTime   THEN a.EndTime   ELSE b.EndTime   END AS e
FROM b
JOIN a ON a.EndTime > b.StartTime AND b.EndTime > a.StartTime

DB<>Fiddle