Имя: Пароль:
1C
1С v8
Поиск пересекающихся интервалов в Таблице Значений
,
0 kAndrat
 
02.04.19
12:51
Всем привет.
Подскажите как можно запросом вытащить из ТаблицыЗначений пересекающиеся интервалы?
Например есть таблица

НачалоПериода            КонецПериода
01.03.2019             05.03.2019
01.03.2019             05.03.2019
01.05.2019             03.05.2019
01.05.2019             04.05.2019

из Нее нужно получить два интервала
01.03.2019             05.03.2019
01.05.2019             03.05.2019
1 Лодырь
 
02.04.19
14:04
А что будет если в таблице встретится интервал 02.03.2019 - 02.05.2019?
2 Радим1987
 
02.04.19
14:07
Сгруппируй Сумма(бла) и отобрать где > 1
3 fisher
 
02.04.19
14:12
В чем необходимость делать это именно запросом?
В качестве стартовой заготовки:
ВЫБРАТЬ *
ИЗ
  Таб КАК Таб1, Таб КАК Таб2
ГДЕ
  Таб1.ДатаНачала МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания
     ИЛИ Таб1.ДатаОкончания МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания
4 sqr4
 
02.04.19
14:14
(3) таблица одна.

Но результат из (0) мне не понятен
5 1Сергей
 
02.04.19
14:15
(4) >>Но результат из (0) мне не понятен

+1
6 fisher
 
02.04.19
14:16
(4) Мне тоже :)
7 13_Mult
 
02.04.19
14:38
(0) А какова логика пересечения?
8 zelyak
 
02.04.19
14:41
Не понятна функция получения значения. Вообще не понятна.
9 Said_We
 
02.04.19
14:51
(0)
"из Нее нужно получить два интервала
01.03.2019             05.03.2019
01.05.2019             03.05.2019"

а почему не ?
01.03.2019             05.03.2019
01.05.2019             04.05.2019

В (0) ерунду спросил. Если несколько периодов пересекаются и надо показать периоды к которым есть пересечения, то необходимо все и показывать.
А если необходимо показывать периоды после сложения пересекающихся периодов, то так и надо спрашивать, только необходимо не забывать, что после пересечения периодов и сложения этих периодов их опять необходимо проверить на пересечение..... :-)

Пример (1-й период и 4-й не пересекаются, но в результате период один с 01 по 15):
1. 01.01.2000 - 05.01.2000
2. 03.01.2000 - 07.01.2000
3. 06.01.2000 - 10.01.2000
4. 09.01.2000 - 15.01.2000
10 Ёпрст
 
02.04.19
15:01
(0) а как Май у вас с Мартом пересекся в ответе ?
11 Ёпрст
 
02.04.19
15:02
Периоды 01.03.2019-05.03.2019 и 01.05.2019-03.05.2019
не пересекаются, если что
12 Said_We
 
02.04.19
15:06
(11) Нет его и не будет, скорее всего. Спросил ерунду. Мы голову ломаем что он спросить хотел, а он пиво пьет :-)
Весь апрель никому не верь.
13 kAndrat
 
02.04.19
15:36
(3) Да, я примерно также и решил сделать, хотелось просто одним запросом все получить.
14 kAndrat
 
02.04.19
15:41
(4) Я упростить просто хотел вопрос.
Задача такова, что в результате запроса выводятся периоды отпусков сотрудников и нужно отловить пересечения и показать их руководителю.
Хотелось выгрузить эти данные в таблицу и там прямо найти все пересечния)
Но в итоге думаю реально проще и может даже правельнее сделать из (3)
15 Said_We
 
02.04.19
15:54
(14) Тогда у вас каждое пересечение это минимум две строки.
Из примера в (0) что на входе, то и на выходе:

НачалоПериода            КонецПериода
01.03.2019             05.03.2019
01.03.2019             05.03.2019
01.05.2019             03.05.2019
01.05.2019             04.05.2019
16 sqr4
 
02.04.19
15:58
(12) тут правильный ответ)
17 sqr4
 
02.04.19
15:59
(12) ты почему то так вкусно написал, что мне тоже пивка захотелось
18 Deon
 
02.04.19
16:01
(14) Там же, наверно, ещё и пересечения в рамках одного отдела интересны, а не по всей конторе?
19 Вафель
 
02.04.19
16:25
т1.датанач <= т2.датакон и т1.датакон >= т2.датанач
20 Said_We
 
02.04.19
16:28
(18) Если про отпуска, то как правило внутри одного отдела по группам сотрудников, которые примерно одним и тем же занимаются. Т.е. что бы не страдал производственный процесс.
В той же бухгалтерии, бухгалтер по ОС и расчетчик ничего как правило про работу друг друга не знают и знать не хотят и могут идти в отпуск одновременно.
21 RomanYS
 
02.04.19
16:30
(3) (14) Не правильно: если один период целиком внутри другого, пересечение в выборку не попадет
22 Said_We
 
02.04.19
16:35
(21) Зато другой период, который внутри попадет. :-)
23 Garykom
 
гуру
02.04.19
16:39
(0)(14) Запросами нормально никак, учите ЯП 1С и алгоритмы.

Потому что потом вам потребуется вывести сотрудников периоды отпусков которых пересекаются и далее скажут а давай по отделам, если в разных то нам пофиг.

Попробуйте научиться думать вперед за людей дающих задачку, что они хотят и зачем.
24 Garykom
 
гуру
02.04.19
16:39
(23) сорри *Только запросами.
Тут придется и ЯП и запросы использовать
25 Сияющий в темноте
 
02.04.19
16:42
Сначала отсортировать все периоды по дате начала.
далее,из таблицы выбираем период с датой начала больше или равной нашей и меньшей или равной дате конца нашего периода,то есть виртуальную упорядоченную таблицу саму с собой соединить.
26 Garykom
 
гуру
02.04.19
16:44
(25) Там еще отдел есть (будет) колонка и сотрудник, их надо сохранить.
Причем выбрать пересечения больше чем определенное кол-во дней.

И да я просто телепатирую ))
27 Garykom
 
гуру
02.04.19
16:47
(26)+ Хотя еще можно должности добавить с хитрой отдельной табличкой взаимозаменяемости для полного кайфа реальной задачки.
28 kAndrat
 
02.04.19
16:53
(26) Это уже все есть в базовой таблице, сотрудники подразделения с интервалами, я это специально не указал, чтобы голову по этому поводу не ломать. Нужно уже играться именно с пересечениями периодов.
29 kAndrat
 
02.04.19
17:04
(18) Да)
30 fisher
 
02.04.19
17:09
(21) Попадет. Там же каждый с каждым сопоставляется. Вот периоды с перекрестными границами попадут дважды. Я поэтому и написал, что это стартовая заготовка.
(23) Для поиска пересечений в рамках отделов достаточно добавить условие на равенство отделов. Сотрудники тоже сохранятся.
31 RomanYS
 
02.04.19
17:12
(30) >> Я поэтому и написал, что это стартовая заготовка.
Так если из этой заготовки ещё и условие (неправильное) убрать от неё вообще ничего не останется.
32 fisher
 
02.04.19
17:14
(31) Почему условие неправильное?
33 RomanYS
 
02.04.19
17:14
(21) (31) Сторно. Попадать будет
34 fisher
 
02.04.19
17:15
Не, если цель получить все зеркальные пересечения, тогда условие можно допилить. А если избавляться от "дублей", тогда смысла нет.
35 Garykom
 
гуру
02.04.19
17:34
(28) Потом тебе скажут "пересечение в 1-2 дня" это не страшно (убери их) и что будешь делать?
36 fisher
 
02.04.19
17:47
Вообще, есть четыре варианта пересечения периодов. Две зеркальные пары. Включение одного периода в другой и перекрестное пересечение.
Можно легко написать набор условий обеспечивающих как отсутствие дублей, так и наличие всех дублей (если для каждого сотрудника нужно отдельно показывать пересекающиеся с ним отпуска других сотрудников).
(35) Расчет количества дней пересечения тоже несложно в запросе сделать (обработка тех же самых четырех вариантов). Пойми меня правильно. Я не фанат одного инструмента. И если что-то проще сделать пост-обработкой, я делаю это пост-обработкой. Но если например речь об отчете СКД, где нежелательно разбивать расчет по местам исполнения, то сложность этой задачи далека от запретительной. И по итогу проще сделать весь расчет в запросе.
37 Garykom
 
гуру
02.04.19
17:55
(36) Для меня для подобных "разовых задач" проще кодом ибо это сделать быстрее, надежнее и гибче.
Легко исправить/допилить и пофиг что на больших данных запросы будут работать быстрее.

Вот если решение в продакшен для тиражного то понятно лучше запросы.

А фанаты одного инструмента мне напоминают забивальщиков гвоздей микроскопом.
38 fisher
 
02.04.19
18:01
(37) В данной конкретной задаче поля для рефакторинга практически нет. Поэтому мое мнение прямо противоположное.
Вот когда подобное пытаются натянуть на анализ логов СКУД (расчет рабочего времени по входу/выходу), вот тут я полностью согласен.
Там возможны хитрые краевые ситуации, которые замучаешься корректно в запросе реализовывать, да и не надо это.
В коде это намного удобнее делается и допиливается на машине состояний.
39 Garykom
 
гуру
02.04.19
18:11
(38) Данная конкретная задача в (0) описана не полностью и совсем не в том виде в котором ее потребуют.
Вот полную задачу запросом еще ладно, но пытаться по несколько раз переделывать запрос это мрак и потеря времени.

Запросы это намного более сложный и высокоуровневый инструмент, там небольшое дополнение к задаче и все переделывать.
Особенно задачи на временные интервалы неудобны для решения запросами.

Потому что через условия это решается банально в двойном цикле.
Допустим кодом писать 5-10 минут. Сколько уже потратил времени ТС на решение запросами? А еще потратит?
40 Сияющий в темноте
 
02.04.19
23:16
Пересечение иньервалов в общем случае требует полный скан таблицы так как интервалы очень плохо индексируются,поэтому,нагрузка на скуль будет большая и вопрос переноса анализа в код достаточно актуален.

для быстрого выбора интервалов нужнл делать хитрый индекс по начальной дате интервала и длине,тогда полного сканирования можно избежать.
41 Garykom
 
гуру
02.04.19
23:37
(40) Не начальной дате лучше а даты/время середины интервала и длине
42 Garykom
 
гуру
02.04.19
23:39
(41) Хотя пофиг можно и начальной
43 Злопчинский
 
03.04.19
00:51
гп ИСе у Ильдаровича вроед подробно запросомрассмотрено
44 zva
 
03.04.19
07:35
45 НЕА123
 
03.04.19
07:58
(14)
а может не нужны интервалы?
календарь с количеством отдыхающих. раскрасить, расшифровать - обычно так.
46 fisher
 
03.04.19
09:24
(39) Свое мнение я уже высказал. Как по мне, запросом эта задача решается и быстрее и лучше, в т.ч. на перспективу. Вы сводите по сути к тому, что лучше использовать тот инструмент, который лучше знаешь :)
(40) Эти рассуждения имели бы какой-то смысл во "взрослых" языках. На практике в 1С, на тех объемах комбинаторных данных, которые могли бы создать ощутимую нагрузку на сиквел, реализация на языке 1С начинает отставать в производительности заметно раньше. Уже от ста тысяч итераций с банальной арифметикой бывает быстрее загнать исходные таблицы в сиквел, вычислить запросом и получить обратно результат.
ЗЫ. Я себя ощущаю в необычном амплуа. Обычно это я доказываю апологетам запросов, что "не запросами едиными" :)
47 Мимохожий Однако
 
03.04.19
09:33
Заполнить интервалы днями, вывести в длинную таблицу значений с колонками по дням и потом схлопнуть по отделам и просуммировать. Количество дней по итогу каждого дня даст то, что хотят.
48 Мимохожий Однако
 
03.04.19
09:34
Возможно, через СКД это удобнее сляпать
49 Garykom
 
гуру
03.04.19
09:37
(47) Сколько в году дней знаем? Количество записей полученных длинных таблиц представляем если там ну пусть пара тысяч человек работают?
50 Мимохожий Однако
 
03.04.19
09:39
(49) Я бы ограничил период текущим годом. 365 колонок
51 Мимохожий Однако
 
03.04.19
09:40
Возможно, регистры расчета пригодились бы
52 Garykom
 
гуру
03.04.19
09:45
(50) КОЛОНОК? Эээ вы в курсе что оно если и взлетит то низехонько-низехонько...
53 Bigbro
 
03.04.19
09:48
вообще не понимаю зачем таблицы колонки и все прочее.
взяли даты отсортировали. для даты начала целевая функция +1 для даты окончания -1. бежим по списку от начала к концу. целевая функция стала 2 и больше - начался интервал пересечения. стала 1 или ноль - закончился.
54 Garykom
 
гуру
03.04.19
09:48
(53) Запросами?
55 Bigbro
 
03.04.19
09:54
(54) мне всегда казалось что нужно использовать подходящие инструменты. в этой задаче я не вижу как можно ее легко и элегантно решить запросами. а без них я написал. но это конечно не значит что кто-то сейчас не напишет простой и красивый запрос, решающий задачу...
56 Лодырь
 
03.04.19
09:55
(54) можно реализовать и запросом этот алгоритм. Но смысла нет.
57 Мимохожий Однако
 
03.04.19
10:01
(52) Да. Понимаю. Для старта и анализа достаточно.
58 Garykom
 
гуру
03.04.19
10:10
Да алгоритм давно разжеван для решения запросами.

Делается отсортированный список-таблица всех уникальных дат (мельчайших интервалов), начала и конца в одну колонку.
Далее присоединяем к каждой дате кол-во дней до следующей по порядку дате.

Ну и банально каждый большой интервал отпуска набираем их этих базовых-мельчайших интервалов.
Смотрим пересечения по базовым интервалам - профит.

Даже кол-во дней пересечения легко считается.
59 Garykom
 
гуру
03.04.19
10:11
(58)+ Есть вариант каждый базовый интервал задавать не датой начала и длительностью в днях, а серединой интервала (дата/время) и длительностью в секундах.
60 Мимохожий Однако
 
03.04.19
10:13
(58) А теперь замени слова "таблица всех уникальных дат (мельчайших интервалов),"  на "все даты в интервалах" и получишь то, что описал я и то, что было подсказано в (2)
61 Garykom
 
гуру
03.04.19
10:27
(60) Ты предложил по дням, т.е. еще мельче поделить.
В (2) ничего не подсказано какая то Нострадамусина.
AdBlock убивает бесплатный контент. 1Сергей