Имя: Пароль:
1C
1С v8
Условие в запросе с датами
0 Сержант ВДВ Онегин
 
17.05.18
15:59
Пишу отчет.
Запрос состоит из регистра состояние Сотрудников, в котором есть даты периода болезни начало болезни и конец болезни.
Затруднение получил вот в какой момент. Итак, ввожу в отчете период

01.05.2018 - 31.05.2018

И вот туда должны попасть вот все эти записи:

Болезнь1 01.04.2018 - 03.05.2018
Болезнь2 28.05.2018 - 06.06.2018
Болезнь3 04.05.2018 - 12.05.2018
Болезнь4 01.01.2018 - 31.10.2018

Как видите, первая запись попадает так как человек болел до 3 мая, а 3 мая у нас входит в отбор.
Вторая запись , человек болел 3 последние три дня мая
Третья запись вполне все ясно
А четвертая декрет почти весь год, но на выбранные период он тоже вне работы.

Какое поставить условие?
1 Волшебник
 
17.05.18
16:02
ГДЕ НачалоБолезни <= КонецПериода И ОкончаниеБолезни >= НачалоПериода
2 Good_Smile
 
17.05.18
16:05
ГДЕ НачалоБолезни Между НачалоПериода И КонецПериода
ИЛИ ОкончаниеБолезни Между НачалоПериода И КонецПериода
3 Волшебник
 
17.05.18
16:05
(2) У тебя Болезнь4 пропущена
4 Good_Smile
 
17.05.18
16:07
(3) точно!
жаль, мне кажется моё условие легче читается, но к сожалению неправильное..
5 Волшебник
 
17.05.18
16:22
ГДЕ
НачалоБолезни Между НачалоПериода И КонецПериода
ИЛИ ОкончаниеБолезни Между НачалоПериода И КонецПериода
ИЛИ НачалоПериода МЕЖДУ НачалоБолезни И КонецБолезни
ИЛИ КонецПериода МЕЖДУ НачалоБолезни И КонецБолезни
6 Сержант ВДВ Онегин
 
18.05.18
08:27
(1)хоть и нелегко читается, но работает правильно )
7 Малыш Джон
 
18.05.18
08:31
(6) почему нелегко? наоборот, по-моему...
есть два интервала. если левым концом одного за правый конец другого зацепляемся или правым за левый - значит есть пересечение.
8 catena
 
18.05.18
08:45
Начало меньше конца И конец больше начала же.
9 SleepyHead
 
гуру
18.05.18
08:52
Задача - вычислить, пересекаются ли два периода
1. ДН1, ДО1 - даты первого периода
2. ДН2, ДО2 - даты второго периода
3. Вычислить интервал пересечения и понять, пересекаются ли периоды

Если эту задачу надо решить в модуле, использую вот такую функцию:

// Возвращает пересечение дат в переменных ДН и ДО
// Результатом функции является ИСТИНА, если интервалы пересекаются
Функция ПересечениеДат(Знач ДН1, Знач ДО1, Знач ДН2, Знач ДО2, ДН='00010101', ДО='00010101')
    ДН=Макс(ДН1,ДН2);
    ДО=Мин(ДО1,ДО2);
    Возврат ?(ДН<=ДО, Истина, Ложь)
КонецФункции

Если в запросе, такое условие:


ВЫБОР КОГДА НАЧАЛОПЕРИОДА(&ДН1, ДЕНЬ) > &ДН2 ТОГДА НАЧАЛОПЕРИОДА(&ДН1, ДЕНЬ) ИНАЧЕ &ДН2 КОНЕЦ <= ВЫБОР КОГДА КОНЕЦПЕРИОДА(&ДН2, ДЕНЬ) < &ДО2 ТОГДА КОНЕЦПЕРИОДА(&ДН2, ДЕНЬ) ИНАЧЕ &ДО2 КОНЕЦ


Вместо ДН1, ДН2, До1, До2 - подставить свои выражения.