【问题标题】:SQL Matching Time durations (fromDatetime- toDatetime)SQL 匹配持续时间(从日期时间到日期时间)
【发布时间】:2021-12-21 04:43:42
【问题描述】:

我有两张桌子

表 A

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

表 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

从表 A 开始,我想根据表 B 中的时间拆分数据。 表 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

【问题讨论】:

    标签: sql sql-server tsql datetime overlap


    【解决方案1】:

    首先,您将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

    【讨论】:

      【解决方案2】:

      我会在 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
      

      【讨论】:

      • 感谢您的回答,但它仍然没有提供我正在寻找的解决方案,它没有创建第一条记录:``` lang-sql select TableA.StartTime as OriginalStartTime , TableA.EndTime作为 OriginalStartTime , row_number() over (order by TableB.StartTime) as part , TableB.StartTime as PortionStartTime , TableB.EndTime 作为 PortionEndTime from #A as TableA inner join #B as TableB on TableB.StartTime>=TableA.StartTime and TableB .EndTime
      • 相应地更改join
      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 2021-08-03
      • 2023-03-25
      • 2016-12-31
      • 1970-01-01
      • 2020-01-03
      • 2012-01-09
      • 1970-01-01
      相关资源
      最近更新 更多