powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти перекрытия в таблице периодов
10 сообщений из 10, страница 1 из 1
Найти перекрытия в таблице периодов
    #38765883
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица в которой хранятся: сотрудник, должность, начало, конец. Надо выбрать по сотрудникам всех кто работает в более чем одной должности и по позициям все на которые назначены более одного работника (в любой из месяцов).
Надо чтобы ДО инсерта или апдейта проверить и предотварить создание "оверлапов".
Как это сделать?

Код: 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.
DECLARE @AssigmentsTable TABLE (
	Id int NOT NULL PRIMARY KEY CLUSTERED (Id ASC),
	Employee nvarchar(32) NULL,
	Job nvarchar(32) NULL,
	StartDate date NULL,
	EndDate date NULL)

INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (1, 'John', 'Junior Cleaner', '2015.01.01', '2015.02.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (2, 'John', 'Cleaner', '2015.04.01', '2015.07.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (3, 'John', 'Seniour Cleaner', '2015.08.01', '2015.12.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (4, 'Mark', 'Boss', '2015.01.01', '2015.12.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (5, 'Phill', 'Helper', '2015.05.01', '2015.06.01')

SELECT * FROM @AssigmentsTable

UPDATE @AssigmentsTable SET Employee = 'Mark', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5
SELECT 0, 'Should not be possible - would be an overlap between 4 and 5 (one employee in several positions)', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
UPDATE @AssigmentsTable SET Employee = 'Phill', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5--undo

UPDATE @AssigmentsTable SET Job = 'Cleaner', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5
SELECT 0, 'Should not be possible - would be an overlap between 3 and 5 (two employees in same position)', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
UPDATE @AssigmentsTable SET Job = 'Helper', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5 --undo

UPDATE @AssigmentsTable SET Job = 'Cleaner', StartDate = '2015.08.01', EndDate = '2015.12.01' WHERE Id = 5
SELECT 0, 'Such udate is possible - we changed job without creating overlaps', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #38765908
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы уже не можете написать простой запрос на поиск пересекающихся периодов ?
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #38765926
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: Glory, здравствуйте.
хотел в первом посте поприветствовать, но подумал - а вдруг пронесет..
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #38765930
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Доброго здоровья !
- Не дождетесь.
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #38766088
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запомните простое правило - интервалы перекрываются, если начало первого меньше или равно концу второго вместе с тем, что начало второго меньше или равно концу первого.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Найти перекрытия в таблице периодов
    #40018804
Фотография dab2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

можно лаконичный пример на поиск итоговых начала и конца пересекающихся интервалов?

Задача подвернулась:

Дана таблица с двумя полями. Первое поле - дата начала события, второе - окончания. События расположены в произвольном порядке, могут пересекаться, одно событие может включать в себя другое и т.д. Необходимо вывести набор дат начала и окончания итогового, объединенного события.

Например, если входные данные

01.09.2017 10.12.2020
03.08.2017 09.01.2019
12.12.2022 10.05.2023
04.01.2000 05.07.2001
01.06.2001 05.08.2001

Результат должен быть

04.01.2000 05.08.2001
03.08.2017 10.12.2020
12.12.2022 10.05.2023

Желательно не использовать в решении циклы и курсоры.
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #40018825
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dab2,

тут - Запрос на укрупнение периодов с полдюжины вариантов
Выбирай
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #40018830
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dab2
Желательно не использовать в решении циклы и курсоры.

Ну так self join с условием, которое Владислав упоминал и выборка минимального начала и максимального конца.
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #40019136
Фотография dab2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
Код: sql
1.
2.
3.
SELECT Даты.дата1, Даты.дата2, Даты_1.дата1, Даты_1.дата2
FROM Даты, Даты AS Даты_1
WHERE (((Даты.дата1)<=[даты_1].[дата2]) AND ((Даты_1.дата1)<=[даты].[дата2]));



Даты.дата1 Даты.дата2 Даты_1.дата1 Даты_1.дата204.01.2000 05.07.2001 01.06.2001 05.08.200104.01.2000 05.07.2001 04.01.2000 05.07.200101.06.2001 05.08.2001 01.06.2001 05.08.200101.06.2001 05.08.2001 04.01.2000 05.07.200103.08.2017 09.01.2019 03.08.2017 09.01.201903.08.2017 09.01.2019 01.09.2017 10.12.202001.09.2017 10.12.2020 03.08.2017 09.01.201901.09.2017 10.12.2020 01.09.2017 10.12.202012.12.2022 10.05.2023 12.12.2022 10.05.2023

Такой результат получается следуя этому совету.
...
Рейтинг: 0 / 0
Найти перекрытия в таблице периодов
    #40023214
Фотография dab2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT  Даты.дата1, Даты.дата2
FROM            Даты CROSS JOIN
                         Даты AS Даты_1
WHERE        (Даты.дата1 <= Даты_1.Дата1) AND (Даты_1.дата2 <> Даты.Дата2) AND (Даты.дата2 >= Даты_1.Дата1) AND (Даты_1.дата1 <> Даты.Дата1);


Как такой вариант?

Результат:
дата1 дата22017-08-03 2019-01-09 2000-01-04 2001-07-05
Но есть одно НО - интервал без перекрытий не отображается:
12.12.2022 10.05.2023

Эффективность на больших данных не тестировал.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти перекрытия в таблице периодов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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