Разделить диапазон времени и даты на конкретную дату на 2 записи - PullRequest
0 голосов
/ 03 октября 2019

Давайте дадим дату и время 2019-04-22 00:00:00.000 (полночь 22 апреля 2019 г.)

Теперь у меня есть таблица записей, которая содержит StartDate и EndDate

ID          StartDate                         EndDate
--------------------------------------------------------------------------
1           2019-04-15 00:00:00.000           2019-04-18 00:00:00.000
2           2019-04-16 00:00:00.000           2019-04-28 00:00:00.000
3           2019-04-23 00:00:00.000           2019-04-25 00:00:00.000

Как разделить записьс ID = 2, чтобы я получил две записи:

  • запись одной даты начала: 2019-04-16 00:00:00.000 и даты окончания: 2019-04-21 23:59:59.000
  • запись двух дат начала: 2019-04-22 00:00:00.000 идата окончания: 2019-04-28 00:00:00.000

В основном, если диапазон имеет дату начала до 2019-04-22 00:00:00.000 и дату окончания после 2019-04-22 00:00:00.000, затем разбейте эту запись на две записи, где дата окончания будет полуночью до 2019-04-22 00:00:00.000 для первой записи и даты начала станет 2019-04-22 00:00:00.000 для второй записи.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Я бы сделал UNION ALL, где первый SELECT возвращает все строки, начинающиеся до заданного datetime, а второй SELECT возвращает все строки, заканчивающиеся после этого datetime. Примерно так:

select id, startdate, case when EndDate < '2019-04-22 00:00:00.000' then EndDate
                           else '2019-04-22 00:00:00.000' end EndDate
from tablename
where startdate < '2019-04-22 00:00:00.000'

UNION ALL

select id, case when startdate > '2019-04-22 00:00:00.000' then startdate
                else '2019-04-22 00:00:00.000' end,
        EndDate
from tablename
where EndDate > '2019-04-22 00:00:00.000'

Выражения case предназначены для настройки времени начала или окончания для перекрывающихся строк, тех, которые разбиты на две отдельные строки.

0 голосов
/ 03 октября 2019

Вы можете использовать следующее решение:

DECLARE @splitDate DATE = '2019-04-22 00:00:00.000';

SELECT ID, StartDate, (select min(i) from (values (test.EndDate), (@splitDate)) AS T(i)) AS EndDate 
FROM table_name WHERE StartDate < @splitDate
UNION ALL
SELECT ID, (select max(i) from (values (test.StartDate), (@splitDate)) AS T(i)) AS StartDate, EndDate 
FROM table_name WHERE EndDate > @splitDate

демо на dbfiddle.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...