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
首先,在两个范围重叠的地方加入 B
和 A
(即,一个范围的某些部分与另一个范围的某些部分重叠)。找到重叠的行后,如有必要,限制 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
我有 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
首先,在两个范围重叠的地方加入 B
和 A
(即,一个范围的某些部分与另一个范围的某些部分重叠)。找到重叠的行后,如有必要,限制 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