Имя: Пароль:
1C
1С v8
как составить запрос
, , ,
0 Evgenchik
 
05.10.18
21:28
Подскажите пожалуйста
есть Таблица:
Сотрудник  ДатаНачала ДатаОкончания
Сотрудник1 1.09        2.09
Сотрудник1 1.09        4.09
Сотрудник2 1.09        2.09
Сотрудник1 4.09        5.09

Как запросом выбрать только такие строки, в которых есть непересекющиеся интервалы дат. Интервал с 1.09 по 2.09 можно не брать, так как он уже есть в интервале с 1.09 по 4.09. То есть должно получится:
Сотрудник  ДатаНачала ДатаОкончания
Сотрудник1 1.09        4.09
Сотрудник2 1.09        2.09
Сотрудник1 4.09        5.09
1 EvgeniuXP
 
05.10.18
22:04
разбей на дни :) 01, 02, 03 04 до даты окончания каждую строку, а потом различные :))))
2 hhhh
 
05.10.18
22:07
(0) что-то ведь интервалы 1.09 - 4.09 и 4.09 - 5.09 пересекаются
3 EvgeniuXP
 
05.10.18
22:07
я вот когда-то думал, как сделать такое: принять, потом уволить, а потом на следующий день принять, при этом такой день не считать за прием, и по увольнению не делать движения на дату как на дату приема в этих случаях и если следующий прием имеет различные реквизиты от предыдущего приема или перемещения, то такой прием считать как перемещение :))) у нас так делают :)
4 Evgenchik
 
05.10.18
22:12
ох, я ошибся в табличке, там два первых сотр и два вторых сотр , простите

Сотрудник  ДатаНачала ДатаОкончания
Сотрудник1 1.09        2.09
Сотрудник1 1.09        4.09
Сотрудник2 1.09        2.09
Сотрудник2 4.09        5.09

Сотрудник  ДатаНачала ДатаОкончания
Сотрудник1 1.09        4.09
Сотрудник2 1.09        2.09
Сотрудник2 4.09        5.09

вон что еще нашел
5 Evgenchik
 
05.10.18
22:13
6 EvgeniuXP
 
05.10.18
22:16
+ контрольное число и по минимуму максимум обратно соберешь периоды.
7 EvgeniuXP
 
05.10.18
22:18
хотя нафига голову ломать, когда цикл сделал, и на пересечение дат взял проверил и минимум максимум взял, и код легкий и гемора потом меньше будет.
8 Evgenchik
 
05.10.18
22:20
мне не нужен минимум и максимум, у Сотрудника2 не должен появится интервал с 3.09 по 4.09
9 youalex
 
06.10.18
00:27
(0) элементарно.
Нарисуй на бумажке интервалы, на основе
визуального представления  обозначь все те случаи, когда они пересекаются, перенеси это на запросную логику.
10 Evgenchik
 
06.10.18
00:36
Вот если кому надо:
ВЫБРАТЬ
    Сотр.Сотрудник КАК Сотрудник,
    Сотр.ДатаНачала КАК ДатаНачала,
    Сотр.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ВТСотрудникиДаты
ИЗ
    &Сотр КАК Сотр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Кален.Дата КАК Дата
ПОМЕСТИТЬ ВТКалендарь
ИЗ
    &Кален КАК Кален
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТСотрудникиДаты.Сотрудник КАК Сотрудник,
    ВТКалендарь.Дата КАК Дата
ПОМЕСТИТЬ ВТДаты
ИЗ
    ВТСотрудникиДаты КАК ВТСотрудникиДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТКалендарь КАК ВТКалендарь
        ПО ВТСотрудникиДаты.ДатаНачала <= ВТКалендарь.Дата
            И (ВТКалендарь.Дата <= ВТСотрудникиДаты.ДатаОкончания)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Даты.Дата КАК Дата,
    Даты.Сотрудник КАК Сотрудник,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатыДо.Дата) КАК Номер
ПОМЕСТИТЬ НомераДат
ИЗ
    ВТДаты КАК Даты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДаты КАК ДатыДо
        ПО (ДатыДо.Дата <= Даты.Дата)
            И (ДатыДо.Сотрудник = Даты.Сотрудник)

СГРУППИРОВАТЬ ПО
    Даты.Дата,
    Даты.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(НомераДат.Дата) КАК ДатаНач,
    МАКСИМУМ(НомераДат.Дата) КАК ДатаКон,
    НомераДат.Сотрудник КАК Сотрудник    
ИЗ
    НомераДат КАК НомераДат

СГРУППИРОВАТЬ ПО
    НомераДат.Сотрудник,
    ДОБАВИТЬКДАТЕ(НомераДат.Дата, ДЕНЬ, -НомераДат.Номер)
11 Консультант Баранов
 
06.10.18
07:19
(0)  >  непересекющиеся интервалы

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