Проверка попадания даты в интервал периодов
По теме из базы знаний
Найденные решения
(6)
ВЫБРАТЬ
ТЧ_Даты.ДатаНачала КАК ДатаНачала,
ТЧ_Даты.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ТабличнаяЧастьДаты
ИЗ
&ТЧ_Даты КАК ТЧ_Даты
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МассивДат.Дата КАК Дата
ПОМЕСТИТЬ МассивДат
ИЗ
&МассивДат КАК МассивДат
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА МИНИМУМ(ВЫБОР
КОГДА ТабличнаяЧастьДаты.ДатаНачала ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ) = 0
ТОГДА Ложь
ИНАЧЕ Истина
КОНЕЦ КАК ЕстьВхождение
ИЗ
МассивДат КАК МассивДат
ЛЕВОЕ СОЕДИНЕНИЕ ТабличнаяЧастьДаты КАК ТабличнаяЧастьДаты
ПО (МассивДат.Дата МЕЖДУ ТабличнаяЧастьДаты.ДатаНачала И ТабличнаяЧастьДаты.ДатаОкончания)
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Ну как-то так:
Если результат запроса пустой, значит не входит, если не пустой, значит входит
Выбрать
Справочник.Ссылка
Из Справочник.НашСправочник.ТабличнаяЧасть КАК Справочник
ГДЕ Справочник.Ссылка = &ТабличнаяЧастьНужногоЭлемента
И &ДатаДокумента МЕЖДУ Справочник.ДатаНачала И Справочник.датаКонца
Если результат запроса пустой, значит не входит, если не пустой, значит входит
(5) Немного поменял условие.
1) Есть некий массив дат.
2) Есть справочник, в табличной части которого хранятся все доступные периоды (ДатаНачала, датаКонца)
Необходимо записать запрос, который поймёт, входит ли даты в один из периодов, указанных в табличной части специального справочника.
1) Есть некий массив дат.
2) Есть справочник, в табличной части которого хранятся все доступные периоды (ДатаНачала, датаКонца)
Необходимо записать запрос, который поймёт, входит ли даты в один из периодов, указанных в табличной части специального справочника.
(6)
ВЫБРАТЬ
ТЧ_Даты.ДатаНачала КАК ДатаНачала,
ТЧ_Даты.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ТабличнаяЧастьДаты
ИЗ
&ТЧ_Даты КАК ТЧ_Даты
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МассивДат.Дата КАК Дата
ПОМЕСТИТЬ МассивДат
ИЗ
&МассивДат КАК МассивДат
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА МИНИМУМ(ВЫБОР
КОГДА ТабличнаяЧастьДаты.ДатаНачала ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ) = 0
ТОГДА Ложь
ИНАЧЕ Истина
КОНЕЦ КАК ЕстьВхождение
ИЗ
МассивДат КАК МассивДат
ЛЕВОЕ СОЕДИНЕНИЕ ТабличнаяЧастьДаты КАК ТабличнаяЧастьДаты
ПО (МассивДат.Дата МЕЖДУ ТабличнаяЧастьДаты.ДатаНачала И ТабличнаяЧастьДаты.ДатаОкончания)
Показать
(8) Додумался сам, не дождавшись решения. Но ваш ответ был ближе всего к то у что мне было нужно
вот мой код:
вот мой код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаявкаНаРасход.Сценарий КАК Сценарий,
| ЗаявкаНаРасход.подразделение КАК подразделение,
| ЗаявкаНаРасход.Период КАК Дата
|ПОМЕСТИТЬ ВТДанныеДокумента
|ИЗ
| Документ.ЗаявкаНаРасход.ДанныеДок КАК ЗаявкаНаРасход
|ГДЕ
| ЗаявкаНаРасход.Ссылка = &Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| СценарииПериоды.ДатаНачала КАК ДатаНачала,
| СценарииПериоды.ДатаОкончания КАК ДатаОкончания,
| СценарииПериоды.Ссылка КАК Сценарий
|ПОМЕСТИТЬ ВТПериоды
|ИЗ
| Справочник.Сценарии.Периоды КАК СценарииПериоды
|ГДЕ
| СценарииПериоды.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТДанныеДокумента.Сценарий КАК Сценарий
| ИЗ
| ВТДанныеДокумента КАК ВТДанныеДокумента)
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| СУММА(ВЫБОР
| КОГДА ВТДанныеДокумента.Дата МЕЖДУ ВТПериоды.ДатаНачала И ВТПериоды.ДатаОкончания
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК ВхождениеВПериод,
| ВТДанныеДокумента.Дата КАК Дата,
| ВТДанныеДокумента.Сценарий КАК Сценарий
|ПОМЕСТИТЬ ВТВхождениеВПериодДаты
|ИЗ
| ВТДанныеДокумента КАК ВТДанныеДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
| ПО ВТДанныеДокумента.Сценарий = ВТПериоды.Сценарий
|
|СГРУППИРОВАТЬ ПО
| ВТДанныеДокумента.Дата,
| ВТДанныеДокумента.Сценарий
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТВхождениеВПериодДаты.Дата КАК Дата,
| ВТВхождениеВПериодДаты.ВхождениеВПериод КАК ВхождениеВПериод,
| ВТВхождениеВПериодДаты.Сценарий КАК Сценарий
|ИЗ
| ВТВхождениеВПериодДаты КАК ВТВхождениеВПериодДаты
|ГДЕ
| ВТВхождениеВПериодДаты.ВхождениеВПериод = 0";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
МассивРез=Запрос.ВыполнитьПакет();
РезультатПроверкаДат = МассивРез[3];
Если не РезультатПроверкаДат.Пустой() Тогда
Отказ=истина;
Сообщить("Дата одной из строк не входит в массив разрешенных периодов");
КонецЕсли;
Показать
Денис, ниже запрос, адаптируйте под свою конфигурацию:
ВЫБРАТЬ РАЗЛИЧНЫЕ
АвансовыйОтчет.Ссылка КАК Ссылка
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НастройкаИнтервалов.ТабличнаяЧасть КАК НастройкаИнтерваловТабличнаяЧасть
ПО (АвансовыйОтчет.Дата МЕЖДУ НастройкаИнтерваловТабличнаяЧасть.НачалоИнтервала И НастройкаИнтерваловТабличнаяЧасть.КонецИнтервала)
ГДЕ
НЕ НастройкаИнтерваловТабличнаяЧасть.Ссылка ЕСТЬ NULL
(2)
Хорошее решение, но не совсем оптимальное с точки зрения производительности
ВЫБРАТЬ РАЗЛИЧНЫЕ
АвансовыйОтчет.Ссылка КАК Ссылка
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НастройкаИнтервалов.ТабличнаяЧасть КАК НастройкаИнтерваловТабличнаяЧасть
ПО (АвансовыйОтчет.Дата МЕЖДУ НастройкаИнтерваловТабличнаяЧасть.НачалоИнтервала И НастройкаИнтерваловТабличнаяЧасть.КонецИнтервала)
ГДЕ
НЕ НастройкаИнтерваловТабличнаяЧасть.Ссылка ЕСТЬ NULL
АвансовыйОтчет.Ссылка КАК Ссылка
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НастройкаИнтервалов.ТабличнаяЧасть КАК НастройкаИнтерваловТабличнаяЧасть
ПО (АвансовыйОтчет.Дата МЕЖДУ НастройкаИнтерваловТабличнаяЧасть.НачалоИнтервала И НастройкаИнтерваловТабличнаяЧасть.КонецИнтервала)
ГДЕ
НЕ НастройкаИнтерваловТабличнаяЧасть.Ссылка ЕСТЬ NULL
Хорошее решение, но не совсем оптимальное с точки зрения производительности
(3)
Откуда вам знать оптимальное это решение или нет, если вы вообще не знаете решения? А если знаете, то зачем тогда мозги людям парите?
Хорошее решение, но не совсем оптимальное с точки зрения производительности
Откуда вам знать оптимальное это решение или нет, если вы вообще не знаете решения? А если знаете, то зачем тогда мозги людям парите?
алгоритм
Ненулевой запрос даст даты которые находятся в каком либо периоде
массив самим подумать как загрузить в запрос
Выбрать
ПолеСвязи
Период
Поместить В ВсеПериоды
////////////////
Выбрать
ПолеСвязи
Период
ГДЕ ДатНач > ДатаИзМассива ИЛИ ДатКонца < ДатаИзМассива
Поместить В ПериодыСОтбором
/////////////////
Выбрать
Период
Из ВсеПериоды ЛЕВОЕ СОЕДИЕНИЕ ПериодыСОтбором ПО ПолеСвязи
ГДЕ ПериодыСОтбором.ПолеСвязи ЕСТЬ NULL
ПоказатьНенулевой запрос даст даты которые находятся в каком либо периоде
массив самим подумать как загрузить в запрос
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот