@zhaar

Как отследить прерывание периода в датах?

Итак, допустим, есть какой-то параметр [ddd] (по факту их много), который имеет в таблице несколько строк с периодом его действия:

name - startdate - enddate
[ddd] - 20190101 - 20190501
[ddd] - 20190502 - 20190607
[ddd] - 20190610 - 29991231

В данных видно, что есть промежуток между второй и третьей строкой - действие заканчивается 7 июня и продолжается только 10 (т.е. 8 и 9 числа выпали). В примере это один, но по факту таких промежутков на периоде может быть и больше.
Думал считать по количеству дней, чтобы найти хотя бы те записи, у которых они не совпадают с датой начала месяца, но понял, что это не вариант, т.к. параметры могут начинаться не с 1 января и заканчиваться раньше текущей даты.

Как этот промежуток можно найти через запрос в MSSQL?

PS: есть возможность использовать следующие версии серверов MSSQL Server Enterprise 2014 и Standard 2016
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
SELECT period.name, period.startdate
FROM period 
  LEFT OUTER JOIN period AS period_end ON period.name = period_end.name 
    AND DATEADD(dd, 1, period.enddate) = period_end.startdate
  WHERE (period_end.startdate IS NULL)

Но сюда будет попадать последний период.
Будем считать, последний период "закрыт" максимальной для name датой, то есть:
ddd	2019-01-01	2019-05-01
ddd	2019-05-02	2019-06-07
ddd	2019-06-10	2019-09-04
ddd	2019-09-05	2999-12-31
aaa	2019-09-01	2019-09-10
aaa	2019-09-12	2019-12-31
aaa	2020-01-01	2020-12-31

SELECT period.name, period.startdate, period.enddate
  FROM period 
    LEFT OUTER JOIN period AS period_end ON period.name = period_end.name 
                              AND DATEADD(dd, 1, period.enddate) = period_end.startdate
  WHERE (period_end.startdate IS NULL) 
     AND (period.enddate <> (SELECT MAX(enddate) FROM period AS period_last 
                                                 WHERE (name = period.name)))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы