Проверка попадания даты в интервал периодов

1. kuza_87 28 15.09.17 07:42 Сейчас в теме
Здравствуйте! Задача следующая:
1) Есть некий массив дат.
2) Есть справочник, в табличной части которого хранятся все доступные периоды (ДатаНачала, датаКонца)

Необходимо записать запрос, который поймёт, входит ли даты в один из периодов, указанных в табличной части специального справочника.
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
8. spacecraft 15.09.17 10:45 Сейчас в теме
(6)
ВЫБРАТЬ
	ТЧ_Даты.ДатаНачала КАК ДатаНачала,
	ТЧ_Даты.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ТабличнаяЧастьДаты
ИЗ
	&ТЧ_Даты КАК ТЧ_Даты
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МассивДат.Дата КАК Дата
ПОМЕСТИТЬ МассивДат
ИЗ
	&МассивДат КАК МассивДат
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА МИНИМУМ(ВЫБОР
					КОГДА ТабличнаяЧастьДаты.ДатаНачала ЕСТЬ NULL 
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) = 0
			ТОГДА Ложь
		ИНАЧЕ Истина
	КОНЕЦ КАК ЕстьВхождение
ИЗ
	МассивДат КАК МассивДат
		ЛЕВОЕ СОЕДИНЕНИЕ ТабличнаяЧастьДаты КАК ТабличнаяЧастьДаты
		ПО (МассивДат.Дата МЕЖДУ ТабличнаяЧастьДаты.ДатаНачала И ТабличнаяЧастьДаты.ДатаОкончания)
Показать
kuza_87; +1
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Dream_kz 129 15.09.17 08:51 Сейчас в теме
(1) Ну как-то так:

Выбрать
    Справочник.Ссылка
Из Справочник.НашСправочник.ТабличнаяЧасть КАК Справочник
ГДЕ Справочник.Ссылка = &ТабличнаяЧастьНужногоЭлемента
И &ДатаДокумента МЕЖДУ Справочник.ДатаНачала И Справочник.датаКонца


Если результат запроса пустой, значит не входит, если не пустой, значит входит
+
6. kuza_87 28 15.09.17 10:25 Сейчас в теме
(5) Немного поменял условие.
1) Есть некий массив дат.
2) Есть справочник, в табличной части которого хранятся все доступные периоды (ДатаНачала, датаКонца)

Необходимо записать запрос, который поймёт, входит ли даты в один из периодов, указанных в табличной части специального справочника.
+
8. spacecraft 15.09.17 10:45 Сейчас в теме
(6)
ВЫБРАТЬ
	ТЧ_Даты.ДатаНачала КАК ДатаНачала,
	ТЧ_Даты.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ТабличнаяЧастьДаты
ИЗ
	&ТЧ_Даты КАК ТЧ_Даты
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МассивДат.Дата КАК Дата
ПОМЕСТИТЬ МассивДат
ИЗ
	&МассивДат КАК МассивДат
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА МИНИМУМ(ВЫБОР
					КОГДА ТабличнаяЧастьДаты.ДатаНачала ЕСТЬ NULL 
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) = 0
			ТОГДА Ложь
		ИНАЧЕ Истина
	КОНЕЦ КАК ЕстьВхождение
ИЗ
	МассивДат КАК МассивДат
		ЛЕВОЕ СОЕДИНЕНИЕ ТабличнаяЧастьДаты КАК ТабличнаяЧастьДаты
		ПО (МассивДат.Дата МЕЖДУ ТабличнаяЧастьДаты.ДатаНачала И ТабличнаяЧастьДаты.ДатаОкончания)
Показать
kuza_87; +1
10. kuza_87 28 18.09.17 06:55 Сейчас в теме
(8) Додумался сам, не дождавшись решения. Но ваш ответ был ближе всего к то у что мне было нужно
вот мой код:
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЗаявкаНаРасход.Сценарий КАК Сценарий,
		|	ЗаявкаНаРасход.подразделение КАК подразделение,
		|	ЗаявкаНаРасход.Период КАК Дата
		|ПОМЕСТИТЬ ВТДанныеДокумента
		|ИЗ
		|	Документ.ЗаявкаНаРасход.ДанныеДок КАК ЗаявкаНаРасход
		|ГДЕ
		|	ЗаявкаНаРасход.Ссылка = &Ссылка
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	СценарииПериоды.ДатаНачала КАК ДатаНачала,
		|	СценарииПериоды.ДатаОкончания КАК ДатаОкончания,
		|	СценарииПериоды.Ссылка КАК Сценарий
		|ПОМЕСТИТЬ ВТПериоды
		|ИЗ
		|	Справочник.Сценарии.Периоды КАК СценарииПериоды
		|ГДЕ
		|	СценарииПериоды.Ссылка В
		|			(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|				ВТДанныеДокумента.Сценарий КАК Сценарий
		|			ИЗ
		|				ВТДанныеДокумента КАК ВТДанныеДокумента)
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	СУММА(ВЫБОР
		|			КОГДА ВТДанныеДокумента.Дата МЕЖДУ ВТПериоды.ДатаНачала И ВТПериоды.ДатаОкончания
		|				ТОГДА 1
		|			ИНАЧЕ 0
		|		КОНЕЦ) КАК ВхождениеВПериод,
		|	ВТДанныеДокумента.Дата КАК Дата,
		|	ВТДанныеДокумента.Сценарий КАК Сценарий
		|ПОМЕСТИТЬ ВТВхождениеВПериодДаты
		|ИЗ
		|	ВТДанныеДокумента КАК ВТДанныеДокумента
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
		|		ПО ВТДанныеДокумента.Сценарий = ВТПериоды.Сценарий
		|
		|СГРУППИРОВАТЬ ПО
		|	ВТДанныеДокумента.Дата,
		|	ВТДанныеДокумента.Сценарий
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ВТВхождениеВПериодДаты.Дата КАК Дата,
		|	ВТВхождениеВПериодДаты.ВхождениеВПериод КАК ВхождениеВПериод,
		|	ВТВхождениеВПериодДаты.Сценарий КАК Сценарий
		|ИЗ
		|	ВТВхождениеВПериодДаты КАК ВТВхождениеВПериодДаты
		|ГДЕ
		|	ВТВхождениеВПериодДаты.ВхождениеВПериод = 0";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	МассивРез=Запрос.ВыполнитьПакет();
	
	РезультатПроверкаДат = МассивРез[3];
	Если не РезультатПроверкаДат.Пустой() Тогда
		Отказ=истина;
		Сообщить("Дата одной из строк не входит в массив разрешенных периодов");
	КонецЕсли;
Показать
+
2. Scop 61 15.09.17 08:09 Сейчас в теме
Денис, ниже запрос, адаптируйте под свою конфигурацию:

ВЫБРАТЬ РАЗЛИЧНЫЕ
	АвансовыйОтчет.Ссылка КАК Ссылка
ИЗ
	Документ.АвансовыйОтчет КАК АвансовыйОтчет
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НастройкаИнтервалов.ТабличнаяЧасть КАК НастройкаИнтерваловТабличнаяЧасть
		ПО (АвансовыйОтчет.Дата МЕЖДУ НастройкаИнтерваловТабличнаяЧасть.НачалоИнтервала И НастройкаИнтерваловТабличнаяЧасть.КонецИнтервала)
ГДЕ
	НЕ НастройкаИнтерваловТабличнаяЧасть.Ссылка ЕСТЬ NULL
+
3. kuza_87 28 15.09.17 08:23 Сейчас в теме
(2)
ВЫБРАТЬ РАЗЛИЧНЫЕ
АвансовыйОтчет.Ссылка КАК Ссылка
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НастройкаИнтервалов.ТабличнаяЧасть КАК НастройкаИнтерваловТабличнаяЧасть
ПО (АвансовыйОтчет.Дата МЕЖДУ НастройкаИнтерваловТабличнаяЧасть.НачалоИнтервала И НастройкаИнтерваловТабличнаяЧасть.КонецИнтервала)
ГДЕ
НЕ НастройкаИнтерваловТабличнаяЧасть.Ссылка ЕСТЬ NULL

Хорошее решение, но не совсем оптимальное с точки зрения производительности
+
7. roman77 303 15.09.17 10:45 Сейчас в теме
(3)
Хорошее решение, но не совсем оптимальное с точки зрения производительности


Откуда вам знать оптимальное это решение или нет, если вы вообще не знаете решения? А если знаете, то зачем тогда мозги людям парите?
user774630; +1
4. Scop 61 15.09.17 08:31 Сейчас в теме
Денис, возможно, надо видеть конфигурацию.
+
9. user623969_dusa 15.09.17 10:59 Сейчас в теме
алгоритм

Выбрать 
ПолеСвязи
Период
Поместить В ВсеПериоды
////////////////
Выбрать 
ПолеСвязи
Период
ГДЕ ДатНач > ДатаИзМассива ИЛИ ДатКонца < ДатаИзМассива
Поместить В ПериодыСОтбором
/////////////////
Выбрать
Период
Из ВсеПериоды ЛЕВОЕ СОЕДИЕНИЕ ПериодыСОтбором ПО ПолеСвязи
ГДЕ ПериодыСОтбором.ПолеСвязи ЕСТЬ NULL
Показать


Ненулевой запрос даст даты которые находятся в каком либо периоде
массив самим подумать как загрузить в запрос
+
11. пользователь 26.12.23 13:30
Сообщение было скрыто модератором.
...
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот