Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Поиск пересекающихся интервалов в Таблице Значений

Поиск пересекающихся интервалов в Таблице Значений
Я
   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?
   Радим1987
 
2 - 02.04.19 - 14:07
Сгруппируй Сумма(бла) и отобрать где > 1
   fisher
 
3 - 02.04.19 - 14:12
В чем необходимость делать это именно запросом?
В качестве стартовой заготовки:
ВЫБРАТЬ *
ИЗ
  Таб КАК Таб1, Таб КАК Таб2
ГДЕ
  Таб1.ДатаНачала МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания
     ИЛИ Таб1.ДатаОкончания МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания
   sqr4
 
4 - 02.04.19 - 14:14
(3) таблица одна.

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

+1
   fisher
 
6 - 02.04.19 - 14:16
(4) Мне тоже :)
   13_Mult
 
7 - 02.04.19 - 14:38
(0) А какова логика пересечения?
   zelyak
 
8 - 02.04.19 - 14:41
Не понятна функция получения значения. Вообще не понятна.
   Said_We
 
9 - 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 
не пересекаются, если что
   Said_We
 
12 - 02.04.19 - 15:06
(11) Нет его и не будет, скорее всего. Спросил ерунду. Мы голову ломаем что он спросить хотел, а он пиво пьет :-)
Весь апрель никому не верь.
   kAndrat
 
13 - 02.04.19 - 15:36
(3) Да, я примерно также и решил сделать, хотелось просто одним запросом все получить.
   kAndrat
 
14 - 02.04.19 - 15:41
(4) Я упростить просто хотел вопрос.
Задача такова, что в результате запроса выводятся периоды отпусков сотрудников и нужно отловить пересечения и показать их руководителю.
Хотелось выгрузить эти данные в таблицу и там прямо найти все пересечния)
Но в итоге думаю реально проще и может даже правельнее сделать из (3)
   Said_We
 
15 - 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
   sqr4
 
16 - 02.04.19 - 15:58
(12) тут правильный ответ)
   sqr4
 
17 - 02.04.19 - 15:59
(12) ты почему то так вкусно написал, что мне тоже пивка захотелось
   Deon
 
18 - 02.04.19 - 16:01
(14) Там же, наверно, ещё и пересечения в рамках одного отдела интересны, а не по всей конторе?
   Вафель
 
19 - 02.04.19 - 16:25
т1.датанач <= т2.датакон и т1.датакон >= т2.датанач
   Said_We
 
20 - 02.04.19 - 16:28
(18) Если про отпуска, то как правило внутри одного отдела по группам сотрудников, которые примерно одним и тем же занимаются. Т.е. что бы не страдал производственный процесс.
В той же бухгалтерии, бухгалтер по ОС и расчетчик ничего как правило про работу друг друга не знают и знать не хотят и могут идти в отпуск одновременно.
   RomanYS
 
21 - 02.04.19 - 16:30
(3) (14) Не правильно: если один период целиком внутри другого, пересечение в выборку не попадет
   Said_We
 
22 - 02.04.19 - 16:35
(21) Зато другой период, который внутри попадет. :-)
   Garykom
 
23 - 02.04.19 - 16:39
(0)(14) Запросами нормально никак, учите ЯП 1С и алгоритмы.

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

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

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

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

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует