powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Добавить недостающие периоды
5 сообщений из 30, страница 2 из 2
Добавить недостающие периоды
    #39589396
Wlr-l,

ну вот, теперь и показывать нечего... :(
...
Рейтинг: 0 / 0
Добавить недостающие периоды
    #39589409
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Всегда ждем Ваших решений!
...
Рейтинг: 0 / 0
Добавить недостающие периоды
    #39589640
Kopelly,

в принципе, Wlr-l уже всё показал.
Осталось только пара-тройка завершающих штрихов, чтобы решение приобрело законченный вид:
1) чутка изменил подход к развороту исходной таблицы,
2) подправил логику формирования значений конечных точек,
3) выкинул CASE, а также тип точки - начало/кончало, ставшие ненужными после шага 2 ...):
4) добавил пересечение с исходными интервалами, чтобы итоговый набор данных принял вид Таблицы №2

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
-- Отчетный период (как пример 2017) ;):
declare @p1 date = '20170101'
      , @p2 date = '20171231';
--
-- 
with
  B as 
    ( -- Исходные данные ("Таблица № 1"):
      select cast(d1 as date) as d1, cast(d2 as date) as d2, tp
        from (values ('20170305','20170319','Отпуск'),
                     ('20170420','20170423','Больничный'),
                     ('20170601','20170614','Отпуск'),
                     ('20170901','20170901','Отпуск')
            ) as T(d1,d2,tp)
)
-- Основная часть запроса:
, C as -- Набор точек смены соятояния... 
    (--Разворачиваем исходные "интервалы действия состояний" в "точки смены состояний":
      select dt
        from b cross apply(values(d1),(dateadd(dd,1,d2)))v(dt)
       where v.dt between @p1 and @p2
     -- Добавляем граничные значения исследуемого интервала:
      union 
      select @p1
      union 
      select  dateadd(dd,1,@p2)
    )
--select * from C;
, D as
    (-- пронумеруем "точки" для дальнейшей их свертки в новые интервалы
	 -- (на версиях MS SQL Server-а, поддерживающего LEAD/LAG этот шаг не нужен)
      select dt, row_number() over (order by dt) rn
        from C
    )
-- select * from D;
--Сформируем новые интервалы, пересечем результат с исходным множеством интервалов
select dl.dt as date_from
     , dateadd(dd,-1, dr.dt) as date_to -- тут мог бы быть LEAD(dt) OVER(order by dt)
     , isnull(b.tp,'Работал') as tp
  from D dl
-- на версиях MS SQL Server-а, поддерживающего LEAD/LAG этот JOIN не нужен
  join D dr on dl.rn=dr.rn-1
-- Прикручиваем исходные интервалы из Таблица №1:
  left join b -- исходная таблица №1
    on b.d2 >= dl.dt
   and dateadd(dd,-1, dr.dt) >= b.d1
 order by date_from;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Добавить недостающие периоды
    #39937381
thely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно несколько усложнить задачу?
что бы результат периодов работы был разбит на месяцы,
т.е. строка
2017-09-02 2017-12-31 Работал
должна быть разбита на
2017-09-02 2017-10-01 Работал
2017-10-02 2017-11-01 Работал
2017-11-02 2017-12-01 Работал
2017-12-02 2017-12-31 Работал
...
Рейтинг: 0 / 0
Добавить недостающие периоды
    #39937713
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thely,

Возьмите заранее сгенеренный календарь и разбейте периоды по месяцам через outer apply/

https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ?????????
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Добавить недостающие периоды
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]