Как связать в запросе поле с датой и СТРОКОВОЕ поле с датой в виде ГГГГ-ММ-ДД?

1. DWZ2 11.05.22 07:59 Сейчас в теме
Есть периодический регистр сведений с поле "Период" и справочник с символьным кодом. Код представляет собой датой в виде ГГГГ-ММ-ДД.

Требуется связать в запросе НАЧАЛОПЕРИОДА(РегистрСведений.Период) с кодом справочника. Можно ли как-то извратиться с ВЫРАЗИТЬ(), ПОДСТРОКА() и т.д.?

Делать в справочнике дополнительное поле с типом "Дата" не хочу.
Вознаграждение за ответ
Показать полностью
Найденные решения
18. laperuz 46 11.05.22 14:38 Сейчас в теме +0.02 $m
(16)изящное - поставить 8.3.20 и воспользоваться новыми возможностями языка запросов.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/
PlatonStepan; +1 Ответить
2. EVKash 14 11.05.22 08:15 Сейчас в теме +0.02 $m
(1)
Делать в справочнике дополнительное поле с типом "Дата" не хочу.

Что на самом деле было бы правильным решением.
Если хотите извращаться, то вот - https://infostart.ru/1c/articles/331805/
4. dehro 5 11.05.22 09:03 Сейчас в теме +0.02 $m
(2)
Что на самом деле было бы правильным решением. ...

Согласен.

(0) Запросто:
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(ЗаказыКлиентов.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ ВТДаты
ИЗ
	РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДаты.Период КАК Период,
	ВЫБОР
		КОГДА ГОД(ВТДаты.Период) = 2000 ТОГДА "2000"
		КОГДА ГОД(ВТДаты.Период) = 2001 ТОГДА "2001"
		КОГДА ГОД(ВТДаты.Период) = 2002 ТОГДА "2002"
		КОГДА ГОД(ВТДаты.Период) = 2003 ТОГДА "2003"
		КОГДА ГОД(ВТДаты.Период) = 2004 ТОГДА "2004"
		КОГДА ГОД(ВТДаты.Период) = 2005 ТОГДА "2005"
		КОГДА ГОД(ВТДаты.Период) = 2006 ТОГДА "2006"
		КОГДА ГОД(ВТДаты.Период) = 2007 ТОГДА "2007"
		КОГДА ГОД(ВТДаты.Период) = 2008 ТОГДА "2008"
		КОГДА ГОД(ВТДаты.Период) = 2009 ТОГДА "2009"
		КОГДА ГОД(ВТДаты.Период) = 2010 ТОГДА "2010"
		КОГДА ГОД(ВТДаты.Период) = 2011 ТОГДА "2011"
		КОГДА ГОД(ВТДаты.Период) = 2012 ТОГДА "2012"
		КОГДА ГОД(ВТДаты.Период) = 2013 ТОГДА "2013"
		КОГДА ГОД(ВТДаты.Период) = 2014 ТОГДА "2014"
		КОГДА ГОД(ВТДаты.Период) = 2015 ТОГДА "2015"
		КОГДА ГОД(ВТДаты.Период) = 2016 ТОГДА "2016"
		КОГДА ГОД(ВТДаты.Период) = 2017 ТОГДА "2017"
		КОГДА ГОД(ВТДаты.Период) = 2018 ТОГДА "2018"
		КОГДА ГОД(ВТДаты.Период) = 2019 ТОГДА "2019"
		КОГДА ГОД(ВТДаты.Период) = 2020 ТОГДА "2020"
		КОГДА ГОД(ВТДаты.Период) = 2021 ТОГДА "2021"
		КОГДА ГОД(ВТДаты.Период) = 2022 ТОГДА "2022"
		КОГДА ГОД(ВТДаты.Период) = 2023 ТОГДА "2023"
		КОГДА ГОД(ВТДаты.Период) = 2024 ТОГДА "2024"
		ИНАЧЕ "ХХХХ"
	КОНЕЦ + "-" + ВЫБОР
		КОГДА МЕСЯЦ(ВТДаты.Период) = 1  ТОГДА "01"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 2  ТОГДА "02"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 3  ТОГДА "03"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 4  ТОГДА "04"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 5  ТОГДА "05"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 6  ТОГДА "06"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 7  ТОГДА "07"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 8  ТОГДА "08"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 9  ТОГДА "09"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 10 ТОГДА "10"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 11 ТОГДА "11"
		ИНАЧЕ "12"
	КОНЕЦ + "-" + ВЫБОР
		КОГДА ДЕНЬ(ВТДаты.Период) = 1   ТОГДА "01"
		КОГДА ДЕНЬ(ВТДаты.Период) = 2   ТОГДА "02"
		КОГДА ДЕНЬ(ВТДаты.Период) = 3   ТОГДА "03"
		КОГДА ДЕНЬ(ВТДаты.Период) = 4   ТОГДА "04"
		КОГДА ДЕНЬ(ВТДаты.Период) = 5   ТОГДА "05"
		КОГДА ДЕНЬ(ВТДаты.Период) = 6   ТОГДА "06"
		КОГДА ДЕНЬ(ВТДаты.Период) = 7   ТОГДА "07"
		КОГДА ДЕНЬ(ВТДаты.Период) = 8   ТОГДА "08"
		КОГДА ДЕНЬ(ВТДаты.Период) = 9   ТОГДА "09"
		КОГДА ДЕНЬ(ВТДаты.Период) = 10  ТОГДА "10"
		КОГДА ДЕНЬ(ВТДаты.Период) = 21  ТОГДА "21"
		КОГДА ДЕНЬ(ВТДаты.Период) = 22  ТОГДА "22"
		КОГДА ДЕНЬ(ВТДаты.Период) = 23  ТОГДА "23"
		КОГДА ДЕНЬ(ВТДаты.Период) = 24  ТОГДА "24"
		КОГДА ДЕНЬ(ВТДаты.Период) = 25  ТОГДА "25"
		КОГДА ДЕНЬ(ВТДаты.Период) = 26  ТОГДА "26"
		КОГДА ДЕНЬ(ВТДаты.Период) = 27  ТОГДА "27"
		КОГДА ДЕНЬ(ВТДаты.Период) = 28  ТОГДА "28"
		КОГДА ДЕНЬ(ВТДаты.Период) = 29  ТОГДА "29"
		КОГДА ДЕНЬ(ВТДаты.Период) = 30  ТОГДА "30"
		ИНАЧЕ "31"
	КОНЕЦ КАК ДатаСтрокой
ИЗ
	ВТДаты КАК ВТДаты
Показать
10. lmnlmn 69 11.05.22 09:54 Сейчас в теме +0.02 $m
(9) Можно "переходную" таблицу из строки в дату программно создать и добавить в запрос. А там уже через соединение.
12. spacecraft 11.05.22 10:18 Сейчас в теме +0.02 $m
(9) можно и через СКД. Программное формирование и вывод в ТЗ. И уже работать с ТЗ.
13. lmnlmn 69 11.05.22 10:20 Сейчас в теме +0.02 $m
(11) Два запроса вместо одного и цикл - 5 минут времени.
22. DWZ2 12.05.22 01:51 Сейчас в теме
(4) Единственно, тут надо ловить, чтобы не попался ГОД, КОТОРОГО У НАС НЕТ.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. EVKash 14 11.05.22 08:15 Сейчас в теме +0.02 $m
(1)
Делать в справочнике дополнительное поле с типом "Дата" не хочу.

Что на самом деле было бы правильным решением.
Если хотите извращаться, то вот - https://infostart.ru/1c/articles/331805/
4. dehro 5 11.05.22 09:03 Сейчас в теме +0.02 $m
(2)
Что на самом деле было бы правильным решением. ...

Согласен.

(0) Запросто:
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(ЗаказыКлиентов.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ ВТДаты
ИЗ
	РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДаты.Период КАК Период,
	ВЫБОР
		КОГДА ГОД(ВТДаты.Период) = 2000 ТОГДА "2000"
		КОГДА ГОД(ВТДаты.Период) = 2001 ТОГДА "2001"
		КОГДА ГОД(ВТДаты.Период) = 2002 ТОГДА "2002"
		КОГДА ГОД(ВТДаты.Период) = 2003 ТОГДА "2003"
		КОГДА ГОД(ВТДаты.Период) = 2004 ТОГДА "2004"
		КОГДА ГОД(ВТДаты.Период) = 2005 ТОГДА "2005"
		КОГДА ГОД(ВТДаты.Период) = 2006 ТОГДА "2006"
		КОГДА ГОД(ВТДаты.Период) = 2007 ТОГДА "2007"
		КОГДА ГОД(ВТДаты.Период) = 2008 ТОГДА "2008"
		КОГДА ГОД(ВТДаты.Период) = 2009 ТОГДА "2009"
		КОГДА ГОД(ВТДаты.Период) = 2010 ТОГДА "2010"
		КОГДА ГОД(ВТДаты.Период) = 2011 ТОГДА "2011"
		КОГДА ГОД(ВТДаты.Период) = 2012 ТОГДА "2012"
		КОГДА ГОД(ВТДаты.Период) = 2013 ТОГДА "2013"
		КОГДА ГОД(ВТДаты.Период) = 2014 ТОГДА "2014"
		КОГДА ГОД(ВТДаты.Период) = 2015 ТОГДА "2015"
		КОГДА ГОД(ВТДаты.Период) = 2016 ТОГДА "2016"
		КОГДА ГОД(ВТДаты.Период) = 2017 ТОГДА "2017"
		КОГДА ГОД(ВТДаты.Период) = 2018 ТОГДА "2018"
		КОГДА ГОД(ВТДаты.Период) = 2019 ТОГДА "2019"
		КОГДА ГОД(ВТДаты.Период) = 2020 ТОГДА "2020"
		КОГДА ГОД(ВТДаты.Период) = 2021 ТОГДА "2021"
		КОГДА ГОД(ВТДаты.Период) = 2022 ТОГДА "2022"
		КОГДА ГОД(ВТДаты.Период) = 2023 ТОГДА "2023"
		КОГДА ГОД(ВТДаты.Период) = 2024 ТОГДА "2024"
		ИНАЧЕ "ХХХХ"
	КОНЕЦ + "-" + ВЫБОР
		КОГДА МЕСЯЦ(ВТДаты.Период) = 1  ТОГДА "01"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 2  ТОГДА "02"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 3  ТОГДА "03"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 4  ТОГДА "04"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 5  ТОГДА "05"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 6  ТОГДА "06"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 7  ТОГДА "07"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 8  ТОГДА "08"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 9  ТОГДА "09"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 10 ТОГДА "10"
		КОГДА МЕСЯЦ(ВТДаты.Период) = 11 ТОГДА "11"
		ИНАЧЕ "12"
	КОНЕЦ + "-" + ВЫБОР
		КОГДА ДЕНЬ(ВТДаты.Период) = 1   ТОГДА "01"
		КОГДА ДЕНЬ(ВТДаты.Период) = 2   ТОГДА "02"
		КОГДА ДЕНЬ(ВТДаты.Период) = 3   ТОГДА "03"
		КОГДА ДЕНЬ(ВТДаты.Период) = 4   ТОГДА "04"
		КОГДА ДЕНЬ(ВТДаты.Период) = 5   ТОГДА "05"
		КОГДА ДЕНЬ(ВТДаты.Период) = 6   ТОГДА "06"
		КОГДА ДЕНЬ(ВТДаты.Период) = 7   ТОГДА "07"
		КОГДА ДЕНЬ(ВТДаты.Период) = 8   ТОГДА "08"
		КОГДА ДЕНЬ(ВТДаты.Период) = 9   ТОГДА "09"
		КОГДА ДЕНЬ(ВТДаты.Период) = 10  ТОГДА "10"
		КОГДА ДЕНЬ(ВТДаты.Период) = 21  ТОГДА "21"
		КОГДА ДЕНЬ(ВТДаты.Период) = 22  ТОГДА "22"
		КОГДА ДЕНЬ(ВТДаты.Период) = 23  ТОГДА "23"
		КОГДА ДЕНЬ(ВТДаты.Период) = 24  ТОГДА "24"
		КОГДА ДЕНЬ(ВТДаты.Период) = 25  ТОГДА "25"
		КОГДА ДЕНЬ(ВТДаты.Период) = 26  ТОГДА "26"
		КОГДА ДЕНЬ(ВТДаты.Период) = 27  ТОГДА "27"
		КОГДА ДЕНЬ(ВТДаты.Период) = 28  ТОГДА "28"
		КОГДА ДЕНЬ(ВТДаты.Период) = 29  ТОГДА "29"
		КОГДА ДЕНЬ(ВТДаты.Период) = 30  ТОГДА "30"
		ИНАЧЕ "31"
	КОНЕЦ КАК ДатаСтрокой
ИЗ
	ВТДаты КАК ВТДаты
Показать
6. lmnlmn 69 11.05.22 09:19 Сейчас в теме
(4) Фундаментально! Не проще ли дату из строки собрать? Заодно из от проблемы 2000 и 2024 избавиться.
7. dehro 5 11.05.22 09:23 Сейчас в теме
(6)Так преобразований меньше.
Если собирать дату нужно:
1. Разделить строку на части
2. Каждую часть преобразовать в число (прямых функций нет)
3. Из чисел через "ДАТАВРЕМЯ" собрать дату.

А тут две операции
1. Выделение части даты числом (год, месяц, дата)
2. Собираем результат через ВЫБОР и соединение строк.
22. DWZ2 12.05.22 01:51 Сейчас в теме
(4) Единственно, тут надо ловить, чтобы не попался ГОД, КОТОРОГО У НАС НЕТ.
3. lmnlmn 69 11.05.22 08:31 Сейчас в теме
(1) Можно. ПОДСТРОКА(), ВЫРАЗИТЬ() и ДАТАВРЕМЯ() вам в помощь. Искренне надеюсь что дальнейшие рекомендации излишни.
5. dehro 5 11.05.22 09:19 Сейчас в теме
(3) Ну как с "ПОДСТРОКА" и "ДАТАВРЕМЯ" поизвращаться понятно.
А чем на может помочь "ВЫРАЗИТЬ"? В языке запросов нет преобразования типов.
8. lmnlmn 69 11.05.22 09:37 Сейчас в теме
(5) Вы правы. Избаловался я CAST-ом из SQL. 1С, действительно, так не умеет. В моем варианте остается только https://infostart.ru/1c/articles/170336/
9. DWZ2 11.05.22 09:45 Сейчас в теме
ДАТАВРЕМЯ() работает только с литералами.

ВЫРАЗИТЬ() строку в число не получилось.

А если через СКД попробовать? Там же можно задействовать пользовательские функции. Только надо не отчёт, а что-то машино-читаемое, т. к. по этой выборке ещё алгоритм пробежаться должен. Это как-то надо с компоновщиком извращаться?
10. lmnlmn 69 11.05.22 09:54 Сейчас в теме +0.02 $m
(9) Можно "переходную" таблицу из строки в дату программно создать и добавить в запрос. А там уже через соединение.
11. DWZ2 11.05.22 10:16 Сейчас в теме
(10) Тогда уж проще вспомогательное поле даты в справочник прописать. Только, в отличие от Вашего решения, пользователей выгонять из базы придётся, а обидно, ведь обработка разовая. Или расширением воспользоваться?
13. lmnlmn 69 11.05.22 10:20 Сейчас в теме +0.02 $m
(11) Два запроса вместо одного и цикл - 5 минут времени.
21. DWZ2 12.05.22 01:41 Сейчас в теме
(13) У меня так и есть, просто хочется красиво. К тому же без связи первый запрос перерабатывать будет, а меня там 20 млн. записей.
25. lmnlmn 69 12.05.22 08:26 Сейчас в теме
(21) Табличку можно же с любого конца построить. Как от строки в дату, так и наоборот. Естественно надо наименьшую выборку брать.
26. DWZ2 13.05.22 00:59 Сейчас в теме
(25) без связи будет перерабатывать первый запрос. Конечно, можно выгрузить второй в массив и сделать "ГДЕ ... В ...", но там 325 элементов, что тоже не фонтан.
14. nomad_irk 76 11.05.22 10:20 Сейчас в теме
(11)т.е. поле с типом дата добавить вы не хотите ровно по той причине, что придется выгонять пользователей из БД? Серьёзно?
15. DWZ2 11.05.22 10:29 Сейчас в теме
(14) Нет, просто не люблю нарушение реляционной модели и дублирования информации
17. nomad_irk 76 11.05.22 11:08 Сейчас в теме
(15)и каким образом поле типа дата будет нарушать реляционную модель?
чтобы не было дублирования данных, значения типа дата необходимо хранить значением типа дата, а не строка, как сделано у вас.
20. DWZ2 12.05.22 01:38 Сейчас в теме
(17) таким образом, что типа "Дата" для кода нет. Поэтому мне придётся либо проверять уникальность этого поля ручками, либо хранить 2 поля и ручками же поддерживать их соответствие.

Обидно, что в Аccess автоматическая проверка уникальности поля и условий в том числе и на несколько полей была ещё 30 лет назад.
24. nomad_irk 76 12.05.22 06:17 Сейчас в теме
(20)контроль и соответствие двух значений выполняется парой-тройкой строк кода.
12. spacecraft 11.05.22 10:18 Сейчас в теме +0.02 $m
(9) можно и через СКД. Программное формирование и вывод в ТЗ. И уже работать с ТЗ.
16. DWZ2 11.05.22 10:43 Сейчас в теме
(12) Кстати, о ТЗ. Можно и вручную пробежаться по ТЗ и найти её пересечение с другой. Связь-то мне для этого была нужна. Только всё решения какие-то неизящные.
18. laperuz 46 11.05.22 14:38 Сейчас в теме +0.02 $m
(16)изящное - поставить 8.3.20 и воспользоваться новыми возможностями языка запросов.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/
PlatonStepan; +1 Ответить
19. dakork 33 11.05.22 15:20 Сейчас в теме
(18)и напороться на критические ошибки при обновлении конфигурации по причине: Ошибка SDBL: Тип поля Code не совместим с типом литерала ...
Оставьте свое сообщение

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