Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

как составить запрос

как составить запрос
Я
   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
 
 
   EvgeniuXP
 
1 - 05.10.18 - 22:04
разбей на дни :) 01, 02, 03 04 до даты окончания каждую строку, а потом различные :))))
   hhhh
 
2 - 05.10.18 - 22:07
(0) что-то ведь интервалы 1.09 - 4.09 и 4.09 - 5.09 пересекаются
   EvgeniuXP
 
3 - 05.10.18 - 22:07
я вот когда-то думал, как сделать такое: принять, потом уволить, а потом на следующий день принять, при этом такой день не считать за прием, и по увольнению не делать движения на дату как на дату приема в этих случаях и если следующий прием имеет различные реквизиты от предыдущего приема или перемещения, то такой прием считать как перемещение :))) у нас так делают :)
   Evgenchik
 
4 - 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

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

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

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