Skip to content
Advertisement

Remove overlapping date intervals

I have two tables in my sql server database :

  • PlannedPeriods : containing periods of future events
  • UnavailabledPeriods : list or periods that are not available

Here’s an example for structure and data :

CREATE TABLE PlannedPeriods(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DateFrom] [datetime] NOT NULL,
    [DateTo] [datetime] NOT NULL,
    [Event] [nvarchar](max) NULL
)
INSERT INTO PlannedPeriods (DateFrom, DateTo, Event)
VALUES
    ('2022-08-29 12:00:00', '2022-08-30 04:00:00', 'Event 1'),
    ('2022-08-30 12:00:00', '2022-08-30 14:00:00', 'Event 2'),
    ('2022-08-31 18:30:00', '2022-08-31 22:30:00', 'Event 3')


CREATE TABLE UnavailabledPeriods(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DateFrom] [datetime] NOT NULL,
    [DateTo] [datetime] NOT NULL
)
INSERT INTO UnavailabledPeriods (DateFrom, DateTo)
VALUES
    ('2022-08-30 01:00:00', '2022-08-30 03:00:00'),
    ('2022-08-31 15:00:00', '2022-08-31 19:00:00')

I would like to remove all unavailable periods from the planned periods in order to obtain this result :

DateFrom             | DateTo
2022-08-29 12:00:00  | 2022-08-30 01:00:00
2022-08-30 03:00:00  | 2022-08-30 04:00:00 
2022-08-30 12:00:00  | 2022-08-30 14:00:00
2022-08-31 19:00:00  | 2022-08-31 22:30:00

Advertisement

Answer

In this case you should be able to collect all dates into a new table and work on it.

DECLARE @Results AS TABLE(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DateValue] [datetime] NOT NULL,
    [DateCode] varchar(10),
    Event varchar(10)
)
INSERT INTO @Results 
SELECT DateFrom, 'PlannedStart', Event FROM PlannedPeriods
UNION ALL
SELECT DateTo, 'PlannedEnd', Event FROM PlannedPeriods
UNION ALL
SELECT DateFrom, 'UnavailableStart', NULL FROM UnavailabledPeriods
UNION ALL
SELECT DateTo, 'UnavailableEnd', NULL FROM UnavailabledPeriods
ORDER BY 1
SELECT A.DateValue AS DateFrom, B.DateValue AS DateTo
, ISNULL(A.Event, B.Event) AS Event
FROM @Results AS A
INNER JOIN @Results AS B ON A.Id = B.Id - 1
Where A.DateCode IN ('PlannedStart', 'UnavailableEnd')
AND B.DateCode NOT IN ('UnavailableEnd')
1 People found this is helpful
Advertisement