【问题标题】:T-SQL - timespan by overlapping datetime columnsT-SQL - 重叠日期时间列的时间跨度
【发布时间】:2018-05-09 14:19:37
【问题描述】:

我想要相互重叠的日期范围的最大期间,如果该期间没有与其他日期范围发生冲突,那么我想要它。

我有这张桌子:

CREATE TABLE [dbo].[table1]
(
    [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NOT NULL
)

以及它们各自的价值观:

INSERT INTO [dbo].[table1]  
VALUES (CAST('2013-11-01 00:00:00.000' AS DateTime), CAST('2013-11-10 00:00:00.000' AS DateTime)),
       (CAST('2013-11-05 00:00:00.000' AS DateTime), CAST('2013-11-15 00:00:00.000' AS DateTime)),
       (CAST('2013-11-10 00:00:00.000' AS DateTime), CAST('2013-11-15 00:00:00.000' AS DateTime)),
       (CAST('2013-11-10 00:00:00.000' AS DateTime), CAST('2013-11-25 00:00:00.000' AS DateTime)),
       (CAST('2013-11-26 00:00:00.000' AS DateTime), CAST('2013-11-29 00:00:00.000' AS DateTime))

预期结果是:

ID    StartDate                  EndDate
--------------------------------------------------------
1     2013-11-01 00:00:00.000    2013-11-25 00:00:00.000
2     2013-11-26 00:00:00.000    2013-11-29 00:00:00.000

提前致谢。

// 编辑 1:谢谢。

有效,但在同一张表中有一个新问题

INSERT INTO [dbo].[table1]  
VALUES (CAST('2018-05-03 08:30:00.000' AS DateTime), CAST('2018-05-03 08:45:00.000' AS DateTime)),
       (CAST('2018-05-03 08:45:00.000' AS DateTime), CAST('2018-05-03 09:30:00.000' AS DateTime)),
       (CAST('2018-05-03 08:45:00.000' AS DateTime), CAST('2018-05-03 11:30:00.000' AS DateTime)),
       (CAST('2018-05-03 12:45:00.000' AS DateTime), CAST('2018-05-03 13:00:00.000' AS DateTime)),
       (CAST('2018-05-03 14:00:00.000' AS DateTime), CAST('2018-05-03 15:45:00.000' AS DateTime)),
       (CAST('2018-05-03 14:15:00.000' AS DateTime), CAST('2018-05-03 15:30:00.000' AS DateTime))

预期结果是:

ID    StartDate                  EndDate
--------------------------------------------------------
1     2018-05-03 08:30:00.000    2018-05-03 11:30:00.000
2     2018-05-03 12:45:00.000    2018-05-03 13:00:00.000
3     2018-05-03 14:00:00.000    2018-05-03 15:45:00.000

【问题讨论】:

  • @MatBailie 。 . .具有讽刺意味的是,我想问:“如果您只想要最大值,为什么会有 两个 结果行?”

标签: sql-server tsql datetime timespan overlapping


【解决方案1】:

非常相似的答案,但使用索引和窗口函数使间隙和孤岛分析更便宜(更快)。

http://sqlfiddle.com/#!18/f19569/3

SELECT
  ROW_NUMBER() OVER (ORDER BY MIN(StartDate)),
  MIN(StartDate),
  MAX(EndDate)
from
(
  SELECT
    *,
    SUM(CASE WHEN PrecedingEndDate >= StartDate THEN 0 ELSE 1 END)
      OVER (ORDER BY StartDate, EndDate)
        AS GroupID
  FROM
  (
    SELECT
      *,
      MAX(EndDate)
        OVER (ORDER BY StartDate, EndDate
                  ROWS BETWEEN UNBOUNDED PRECEDING
                           AND 1 PRECEDING
             )
               AS PrecedingEndDate
    FROM
      Table1
  )
    look_back
)
  grouped
GROUP BY
  GroupID

【讨论】:

    【解决方案2】:

    这是间隙和孤岛问题的一种形式。

    在这种情况下,exists 和累积和和group by 是解决方案的途径:

    select row_number() over (order by min(startdate)),
           min(startdate), max(enddate)
    from (select t1.*, sum(isstart) over (order by startdate) as grp
          from (select t1.*,
                       (case when exists (select 1
                                          from table1 tt1
                                          where tt1.startdate <= t1.enddate and tt1.enddate >= t1.startdate and tt1.id <> t1.id
                                         )
                             then 0 else 1
                        end) as isstart
                from table1 t1
               ) t1
         ) t1
    group by grp;
    

    【讨论】:

    • 感谢 - 快速解决方案和提示“差距和孤岛”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多