Процент от даты в запросе

1. user771753 19.07.18 15:32 Сейчас в теме
Всем привет!

Как получить некий процент от даты в запросе? Предположим, у меня есть условие, что разница некой даты и выбранной пользователем даты отчета не должна быть более 10 процентов от это некой даты. Как вычислить этот процент от даты?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Boneman 298 19.07.18 15:54 Сейчас в теме
(1) есть в запросе такая функция "РазностьДАТ"
Соответственно вычисляешь количество секунд, или часов между датами - а дальше обычная математика.


Ну и да, как заметил (2) - должен быть параметр, чему равно 100%. День, неделя, год... иначе математика не поможет
12. spacecraft 19.07.18 18:27 Сейчас в теме
(1) вот, наваял пример. Возможно требует доработки и оптимизации, но идея должна быть понятна.
ВЫБРАТЬ
	"03182001" КАК Серия,
	ДАТАВРЕМЯ(2021, 4, 1) КАК СрокГодности
ПОМЕСТИТЬ вт_серии

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"01172001",
	ДАТАВРЕМЯ(2019, 4, 1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"03172001",
	ДАТАВРЕМЯ(2021, 4, 1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"05182001",
	ДАТАВРЕМЯ(2021, 4, 1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"07182001",
	ДАТАВРЕМЯ(2021, 4, 1)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	1 КАК Число,
	"01" КАК Строка
ПОМЕСТИТЬ втМесяцы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2,
	"02"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3,
	"03"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4,
	"04"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5,
	"05"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6,
	"06"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7,
	"07"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8,
	"08"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9,
	"09"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	10,
	"10"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	11,
	"11"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	12,
	"12"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	2010 КАК Число,
	"10" КАК Строка
ПОМЕСТИТЬ втГода

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2011,
	"11"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2012,
	"12"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2013,
	"13"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2014,
	"14"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2015,
	"15"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2016,
	"16"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2017,
	"17"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2018,
	"18"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2019,
	"19"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2020,
	"20"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2021,
	"21"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт_серии.Серия КАК Серия,
	вт_серии.СрокГодности КАК СрокГодности
ИЗ
	вт_серии КАК вт_серии
		ЛЕВОЕ СОЕДИНЕНИЕ втГода КАК втГода
		ПО (ПОДСТРОКА(вт_серии.Серия, 3, 2) = втГода.Строка)
		ЛЕВОЕ СОЕДИНЕНИЕ втМесяцы КАК втМесяцы
		ПО (ПОДСТРОКА(вт_серии.Серия, 1, 2) = втМесяцы.Строка)
ГДЕ
	ГОД(ДОБАВИТЬКДАТЕ(&ТекущаяДата, МЕСЯЦ, -РАЗНОСТЬДАТ(&ТекущаяДата, вт_серии.СрокГодности, МЕСЯЦ) * 0.9)) * 100 + МЕСЯЦ(ДОБАВИТЬКДАТЕ(&ТекущаяДата, МЕСЯЦ, -РАЗНОСТЬДАТ(&ТекущаяДата, вт_серии.СрокГодности, МЕСЯЦ) * 0.9)) < втГода.Число * 100 + втМесяцы.Число
Показать
2. Octopus 337 19.07.18 15:34 Сейчас в теме
Что такое процент от даты? Чему равны 10% от сегодняшнего числа?
pm74; user774630; GOshaSaveiko; +3 Ответить
6. GOshaSaveiko 38 19.07.18 16:00 Сейчас в теме
(1),
1. Разность дат в секундах между датой изготовления и датой окончания срока годности
2. Разность дат в секундах между датой изготовления и текущей датой
3. [2] / [3]

(5) можно, конечно, попробовать поизгаляться с ПОДСТРОКА() и ДАТАВРЕМЯ() в запросе. Но по-моему лучше бы данные подготовить, либо добавить реквизит в серию, либо регистр завести - серия/дата-изготовления.
4. user771753 19.07.18 15:58 Сейчас в теме
Постановщик задачи говорит следующее:

Есть серия, в названии которой зашифрована дата изготовления - первые 4 цифры номера(тип номера - строка) серии это месяц и год(0318, например, март 2018-го года). Также у серии есть дата "Годен до"(тип - дата, 01.04.2021). Разница между датой в номере и датой "Годен до" - это 100%. Разница между текущей датой и сроком годности - это некий процент(в подавляющем большинстве случаев меньший) от разницы даты из номера серии и ее датой "Годен до".

Итого:

Товар 1. Серия номер: 03182244. Годен до: 01.04.2021

Получаем: дата изготовления - 01.03.2018(по первым 4-м цифрам номера). Годен до - 01.04.2021. Итого срок годности - 13 месяцев.

Текущая дата - 19.07.2018. 01.04.2021 - 19.07.2018 = 9 месяцев или сколько то там секунд(много). Так вот, эта разница(между тек. датой и сроком годности) не должна быть более 10 процентов от разности даты изготовления и окончания срока годности.
5. user771753 19.07.18 16:00 Сейчас в теме
Отсюда вопрос - можно ли в запросе получить из первых четырех чисел номера нужную дату?
7. Boneman 298 19.07.18 16:02 Сейчас в теме
(5) можно, только это геморное дело прям в запросе парсить. В запрос надо параметры подготовленные загонять.


Общая информация для ознакомления https://infostart.ru/public/170336/
8. user771753 19.07.18 16:06 Сейчас в теме
(7) Ну хоть примерно, как это можно сделать?
9. Boneman 298 19.07.18 16:07 Сейчас в теме
10. user771753 19.07.18 16:28 Сейчас в теме
(9) Спасибо, буду пробовать.
11. Timur.V 78 19.07.18 16:52 Сейчас в теме
(8) Примерно ))
Выразить из Строки в число - не реализовано фирмой 1с.

МояДата = "0318";
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ 
		|	Подстрока(&МояДата,3,2) КАК Год,
		|	Подстрока(&МояДата,1,2) КАК Месяц,
		|	""20"" + Подстрока(&МояДата,3,2) КАК Год,
	    |	ВЫРАЗИТЬ(Подстрока(&МояДата,1,2) КАК ЧИСЛО) КАК В3";
	                       			
	//"ВЫБРАТЬ ДАТАВРЕМЯ(Подстрока(МоеПоле,3,2),Подстрока(МоеПоле,1,2),1,0,0,0) КАК Поле1";
	
	Запрос.УстановитьПараметр("МояДата", МояДата); 
	Выборка = Запрос.Выполнить().Выбрать(); 	
	Пока Выборка.Следующий() Цикл
		// Вставить обработку выборки ВыборкаДетальныеЗаписи
		d =1;
	КонецЦикла;


F = ТекстЗапросаИзСтрокиВЧисло("МояДата", 2);  // https://kb.mista.ru/article.php?id=666
Показать


Получается более менее простой способ - это выгрузить в Таблицу значений из запроса 0318 и на языке 1С разобрать.
А потом присоеденить к запросу снова.
Оставьте свое сообщение

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