Выразить число как строку и дату как строку в запросе

09.10.17

Разработка - Запросы

Предлагается новый и более компактный метод преобразования даты и числа в строку в запросе

В языке запросов отсутствуют встроенные функции преобразования одних типов данных в другие, например, строк в числа или даты и наоборот. В работе «Выразить строку как число и строку как дату в запросе» были предложены достаточно  компактные способы преобразований «из строки». Теперь дошла очередь до обратных к ним преобразований «в строку».

Основной проблемой рассматриваемого преобразования в строку является выделение каждого конкретного разряда исходного числа. Например, число 123 состоит из трех разрядов. Пусть разряды нумеруются справа налево, начиная с нуля. Разряды отличаются весом: нулевой разряд в десятичной позиционной системе счисления имеет вес 1, первый – 10, второй – 100 и так далее. Для выделения каждого разряда требуется найти целое от деления числа на вес разряда, а затем – остаток от деления полученного целого на 10. Первый (второй слева) разряд, таким образом, получится так: 123 разделим на 10, получим 12,3. Затем возьмем целое, получим  12. Затем найдем остаток от деления на 10, получим 2 – искомый первый (второй слева) разряд. Буквальная запись этих выражений в запросе получается очень и очень громоздкой, но существует другой путь.

Этот путь заключается в использовании для нахождения остатка от деления пары функций: СЕКУНДА и ДОБАВИТЬКДАТЕ. Дело в том, что функция СЕКУНДА фактически является функцией остатка от деления на 60 числа секунд, прошедшего с начала времен. Чтобы превратить ее в функцию расчета остатка от деления на 10 достаточно считать секунды шестерками. То есть требуемая функция будет записываться так:

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 6) ) / 6

Эта функция выделяет самый правый (нулевой) разряд числа Икс. Чтобы выделить первый разряд, нужно использовать функцию

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.6) ) / 6

А чтобы выделить второй – функцию

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 0.06) ) / 6

И так далее. Множитель 60 позволяет выделить разряд десятых долей, 600 – сотых и так далее.

Ограничением рассмотренного подхода является максимальное число секунд при работе с датами. Оно таково, что мы можем выделить не более 10-ти десятичных знаков в числе. Если число значащих знаков больше, исходное число потребуется предварительно разделить на две части «обычным» способом с использованием операции ВЫРАЗИТЬ КАК.

Приведем пример запроса для случая ЧИСЛО(10, 2)

ВЫБРАТЬ
	ПОДСТРОКА("0123456789", &Число / 10000000 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 6)) / 6 + 1, 1)
	+ "." 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 60)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка

Чтобы сделать запись чуть более короткой, две постоянные - цепочку цифр «0123456789» и начало времен можно вынести во вложенный запрос

ВЫБРАТЬ
	ПОДСТРОКА(Ц, &Число / 10000000 + 1, 1) 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6)) / 6 + 1, 1)
	+ "." 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 60)) / 6 + 1, 1) 
	+ ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
ИЗ (ВЫБРАТЬ "0123456789" Ц, ДАТАВРЕМЯ(1, 1, 1) О) КАК Константы

Аналогичным образом можно преобразовать число в строку в двоичной системе счисления. Вот запрос для записи в виде строки восьми младших двоичных разрядов заданного числа:

ВЫБРАТЬ
	  ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 128)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 64)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 32)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 16)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 8)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 4)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30 / 2)) / 30 + 1, 1)
	+ ПОДСТРОКА("01", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 30)) / 30 + 1, 1) КАК Строка

 

Побочным следствием использованных закономерностей является то, что выражение

СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Икс * 30) ) = 0

можно использовать в запросе для проверки четности числа Икс.

Для перевода даты в строку достаточно перевести в строку по отдельности число дней, месяцев и лет исходной даты. В итоге получается следующий запрос

ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ДЕНЬ(&Дата) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1) 
	+ "/" 
	+ ПОДСТРОКА("0123456789", МЕСЯЦ(&Дата) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1) 
	+ "/" 
	+ ПОДСТРОКА("0123456789", ГОД(&Дата) / 1000 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6)) / 6 + 1, 1) КАК Строка

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

запрос преобразование в строку

См. также

SALE! %

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 10000 руб.

02.09.2020    161660    893    399    

874

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    10335    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5540    XilDen    36    

81

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    8216    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2495    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    9139    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3459    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. spetzpozh 23.02.15 00:42 Сейчас в теме
Моя обычная реакция на публикации Маэстро - посмотрел, почесал репу, плюсанул и пошел дальше )))
shima; user1619761; RibD; olezhe; svezr; kas1989; cosmo2004; Tworozhok; myoker; Ali1976; CrazyVirus; user717534; Irwin; Kinestetik; tulakin_s; Famza; Cerberus1; denis_aka_wolf; Glebis; strange2007; acanta; manlak; ZLENKO; Somebody1; ZOMI; jif; magvay_k; DJDUH; xomaq; ice-net; 1cWin; kolessov_a; sstas007; sergio199; rpgshnik; Mails79; Anchoret; корум; veretennikoff; h00k; swimdog; flagma; NazarovV; orfos; hornet_X; Ananas_Zar; trumanl; MaxDavid; xCorsair; DrAku1a; _also; bds22; smit1c; Йожкин Кот; necropunk; lidersoft2; monkbest; Evil Beaver; slavap; Поручик; bulpi; Nuobu; Dmirily; DoctorRoza; iov; Tavalik; Uncore; pavlov_dv; w-divin; Makushimo; spezc; dj_serega; +72 Ответить
2. ololoanonim 3 23.02.15 11:20 Сейчас в теме
Выглядит весьма круто =)
корум; rpgshnik; +2 Ответить
3. GROOVY 2510 23.02.15 13:41 Сейчас в теме
Фундаментально выглядит. Но нафига? Никогда не понимал, зачем это нужно.
Запрос оперирует данными, нужно красивое представление - для этого есть другие механизмы.
ИНТЕГРА; Ildar13; Gureev; ZeroSumGame; kild; sanek050388; SP2000; nk25; tsmult; h00k; sergey512; monkbest; Nuobu; DoctorRoza; Dmitryiv; +15 5 Ответить
4. ildarovich 7935 23.02.15 15:53 Сейчас в теме
(3) GROOVY, вот небольшой перечень ссылок, который показывает, насколько часто встречается этот вопрос:
Преобразование строки в число/числа в строку в запросе
Как уже в запросе объединить число и строку?
Сложение строк в запросе
Дата в строку в запросе..
Как преобразовать дату в строку в запросе ?
v8: Операции преобразования Число в Строку и обратно в запросах
Вычисление строки в запросе.
Другие можно получит поиском "1С запрос дата число в строку"
Возможно, в половине случаев здесь действительно неправильно поставлена задача и лучше производить преобразование вне запроса.
Но, думаю, есть и случаи обоснованной необходимости таких преобразований.

Немного пофантазировав, можно привести такие примеры:
1) Проверить контрольные соотношения в разрядах ИНН, SSC, EAN (потребуется преобразование строки в число, выделение и сложение разрядов числа, расчет остатка);
2) Сформировать номера договоров, включающие даты;
3) Сформировать номера накладных, включающих даты;
4) Сформировать артикулы, включающие размер, вес или другие числовые характеристики товара;
5) Проверить набор признаков, закодированных в одном числе;
6) Найти пропущенные номера документов запросом;
7) Выделить (внести) вес из (в) штрих-кода весового товара.

Разумеется, здесь имеется ввиду, что формирование и проверка делаются не для вывода, а для последующего использования внутри пакетного запроса: поиска, сравнения, вычисления, группировки.

Я, в общем-то, понимаю ваши сомнения. Но мне интереснее не убеждать людей, что их вопрос неправильный, а искать решение непростой задачи, рассуждая, что был бы метод, а задача найдется.

Кроме того, здесь должен быть отдельно интересен прием компактной записи расчета остатка. Разложив 60 на множители, получим 2х2х3х5. Это значит, что через СЕКУНДА можно рассчитать остаток от деления на 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60. А через функцию ЧАС (24 = 2х2х2х3) еще на 8 и 24.
user1619761; user773200; RibD; Vidz; pchelov_ia; olezhe; Shmell; ЧИА; dabu-dabu; SagittariusA; Devi; EMelihoff; Dmitri93; Kinestetik; monday14; tulakin_s; Gendelf; AliceLight; HitGroove; user1019590; rinik88; ZeroSumGame; Dementor; manlak; sm.artem; WizaXxX; Kabal; ViteG; rpgshnik; ABudnikov; sergio199; sss_russian; CratosX; iov; AlmazBur01; ugroblin; Dolly_EV; Оля_; BalyunovVV; Gesperid; +40 Ответить
51. ser6702 174 23.07.18 10:15 Сейчас в теме
(4) плюсую... как гимнастике ума не более. Инога этим сам страдаю. Но на самом деле вредная статья. Поясню:

Приведен перечень ссылок на вопросы, но вопросы эти ползут от ... непонимания - не так ли?
Сам на первых этапах при переходе от скуля и ора (с,паскаль) задавал сначала такие. На самом деле есть два мощных серврера СУБД и 1С, которые надо полномасштабно использовать. Не передавая на СУБД те задачи, которые ей не предназначены.

Пример:
В одной из конфигураций ( разработка внутренняя ) для ведения административно хозяйственной деятельности банка весь расчет амортизации ОС перенесли на запрос. А зачем спрашиваю? СУБД для 1С в основном служит для быстрого поиска... хранения данных и т.д. Все расширения типа pl/sql по сути реализованы в языке ... сервера приложений 1С. Кластер СУБД , им рулят его админы, и кластер 1С - оба мощные вычислительные комплексы. Сервер приложений 1С это тоже мощная машина с огромными ресурсами, которые надо использовать. Оптимизация состоит в том, чтобы с клиента один раз обратиться к серверу приложений 1С, с него за раз получить данные из субд и вернуть обратно через сервер приложений 1С на клиента. Опустил пока вопрос записи - объектная модель конечно по сравнению с табличной проигрывает, но зато взаимное поведение объектов относительно друг друга всегда предсказуемо.

Не надо кластер СУБД нагружать ему не предназначенными задачами - надо их верно перераспределять между кластерами СУБД и 1С.

Вы согласны с тем, что все эти переводы из строки туда обратно грамотно реализовать на сервере приложений 1С?
33. nk25 09.06.17 06:40 Сейчас в теме
(3) ну вот увлекается он этим :)
если бы в 1с-ком языке появился pl/sql с хранимыми процедурами то наверно все было по другому
41. sanek050388 16.10.17 13:01 Сейчас в теме
42. ildarovich 7935 16.10.17 14:27 Сейчас в теме
(41)
Сказали мне, что эта дорога меня приведёт к океану смерти,
И я с полпути повернула вспять.
С тех пор все тянутся предо мною кривые, глухие окольные тропы…
74. AnryMc 848 18.06.21 13:43 Сейчас в теме
(42)
Сказали мне, что эта дорога меня приведёт к океану смерти,
И я с полпути повернула вспять.
С тех пор все тянутся предо мною кривые, глухие окольные тропы…


Мы встречаем свою судьбу на пути, который избираем, чтоб уйти от неё.
— Жан де Лафонтен
78. danilo.skiman 13 15.08.22 09:18 Сейчас в теме
(3) В СКД когда вам нужно вывести например Входящий документ № ***** от ***** - а у вас есть только номер строкой и дата. Чтобы не городить огород в обработке компоновки все можно решить запросом.
5. break 33 24.02.15 10:35 Сейчас в теме
а без значащихся нулей перед числами можно соорудить?
voneska7; Maximysis; rpgshnik; +3 Ответить
6. ildarovich 7935 24.02.15 11:17 Сейчас в теме
(5) break, можно, если интерес не праздный. Приведите пример практической задачи - сделаю.
53. FilatovRA 174 15.10.18 18:32 Сейчас в теме
(6) Практический пример: Есть данные о неких внутренних идентификаторах номенклатуры, приведенных в справочнике с реквизитами "Номенклатура"(Справочник-номенклатура) и "Идентификатор"(Число).
Пример записи:
Маршрутизатор 12345678

Есть запись справочника "Номенклатура" введенная вручную, вида:

"Маршрутизатор 12345678 ПонятияНеИмеюЗачемЭтиЦифры".
Задача: заполнить некий регистр, хранящий записи о соответствиях этих 2х записей.
44. IVANTHESPACEBIKER 11.12.17 16:12 Сейчас в теме
(5)

ВЫБРАТЬ
	ВЫБОР
		КОГДА &Число / 10000000 > 1
			ТОГДА ПОДСТРОКА("0123456789", &Число / 10000000 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1000000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.000006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 100000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.00006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 10000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.0006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1000 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.006)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 100 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 10 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.6)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА &Число / 1 > 1
			ТОГДА ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 6)) / 6 + 1, 1)
		ИНАЧЕ ""
	КОНЕЦ + "." + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 60)) / 6 + 1, 1) + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 600)) / 6 + 1, 1) КАК Строка
Показать
7. chmv 26.02.15 12:55 Сейчас в теме
А попроще. Может быть когда-нибудь и 1с это реализует
8. gaglo 27.02.15 09:58 Сейчас в теме
Большое спасибо за идею использования функции СЕКУНДА для получения остатка от деления. (Кажется мне, что простая проверка четности и другой кратности в запросе надобна чаще, чем перевод числа в строку.)
dabu-dabu; ser6702; +2 Ответить
9. chmv 27.02.15 10:07 Сейчас в теме
8 Как раз Вы не правы, чаще перевод даты в строку
10. Поручик 4693 08.03.15 21:26 Сейчас в теме
На статьи автора у меня тоже реакция одна - почитал, плюс, порадовался, что есть люди с фундаментальным образованием. Сам бы ни за что не написал.
voneska7; alest; KoC_one; Kinestetik; xpess; POLGA; h00k; Evil Beaver; +8 Ответить
11. monkbest 114 17.03.15 11:04 Сейчас в теме
Я правильно понимаю, что строки полученные Вашим методом, потом можно складывать?

Потому что такой вот запрос вернет число как строку неограниченной длины
ВЫБРАТЬ
	ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов,
	ПРЕДСТАВЛЕНИЕ(ВзаиморасчетыССотрудниками.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов1
ИЗ
	РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
ГДЕ
	ВзаиморасчетыССотрудниками.Сотрудник = &Сотрудник
12. ildarovich 7935 17.03.15 13:13 Сейчас в теме
(11) monkbest, да, можно складывать.
В вашем запросе "представление" это строка, которая формируется не в СУБД, а платформой в процессе постобработки запроса. Также как "итоги", например. Поэтому "представление" вы никак в самом запросе далее использовать не можете.
А строки, полученные в приведенных выражениях, можно использовать в запросе дальше. По ним можно группировать, соединять и прочее. Это обычное выражение языка запросов, хотя и несколько громоздкое.
13. sanfoto 502 23.03.15 07:04 Сейчас в теме
(12)
В вашем запросе "представление" это строка, которая формируется не в СУБД, а платформой в процессе постобработки запроса.


так то в принципе и 1С запросы - не чисто SQL запросы, а реляционно-подобные "объектные запросы к ВИРТУАЛЬНОЙ объектной модели"...
т.е. в процессе выполнения такого "объектного запроса" - генирится много дополнительного SQL кода для получения этих объектов..
К чему я это пишу - к тому что повальное увлечение переноса абсолютно всего кода в "1С запрос" - совсем не всегда оправдано на платформе "1С". На практике часто бывает быстрей отрабатывает(и пишется..) код с циклами с использованием 1С объектов "ТаблицаЗначений" и т.д.
14. ildarovich 7935 23.03.15 16:48 Сейчас в теме
(13) sanfoto, я противник крайностей. "Повальным увлечениям" стараюсь не поддаваться. Всегда нужно сравнивать время решения задачи запросом и кодом. Но, чтобы сравнивать решения, нужно их иметь. Вот тут и приведено возможное решение в запросе. Не чтобы безусловно использовать, а чтобы сравнить и выбрать. Таким образом у нас расширяется пространство возможностей, а уж выбор каждый делает сам в зависимости от конкретной задачи.
Sorm; Kinestetik; tulakin_s; ser6702; Sapiens_bru; user747571; Designer1C; Kabal; fishca; mikele_bes; ABudnikov; premierex; realsevere; UniversaLL; sanfoto; +15 Ответить
15. alex_4x 87 25.08.15 13:01 Сейчас в теме
smartcoder; alest; Lelic24RUS; johny1987; user1759258; G_101343795907160391674; Leon29; Devi; EMelihoff; mszsuz; 02RUSlan; vvp117; bohdan-k; tulakin_s; snood; Valet; xpess; user774630; Gureev; user988634; purgin; FesenkoA; lunjio; Shurgent; manlak; 1cNike; Артано; evakuzmina; brr; Alex_grem; Kabal; DomenER; xomaq; Leoway; denis83; ice-net; ixijixi; Yakud3a; NeLenin; sergio199; SergeyTerentyev; корум; IlyaSR; slawanix; AfroditaS; jokereinherjar; madonov; CratosX; NeviD; Cruciann; Winstoncuk; Nelli_A86; SavR11; sanfoto; Dementor; fvadim; Ali1976; hotey; Sergey_1c; ditp; tarassov; +61 Ответить
16. ildarovich 7935 26.08.15 13:08 Сейчас в теме
(15) alex_4x, картинку сами рисовали (редактировали) или взяли откуда?
17. alex_4x 87 26.08.15 13:34 Сейчас в теме
(16) Это Дилберт! Они очень наслышаны о нашей 1С :-)
18. Serj1C 483 13.01.16 13:18 Сейчас в теме
Связываться с датами для усечения дробной части? не накладно?
Может попробовать функцию Выразить(&Число-0.49 как Число(15,0)) ?
19. ildarovich 7935 13.01.16 14:46 Сейчас в теме
(18) Serj1C, в этом случае у меня получалось более громоздкое выражение. Поскольку для выделения одной цифры целое нужно было находить дважды. А по затратам времени, думаю, результаты должны быть примерно одинаковыми. То есть при примерно равных затратах времени выбираем меньшую громоздкость. Такое обоснование.
20. Sgeor 14.01.16 11:24 Сейчас в теме
Пригодился этот метод для таблиц из внешней БД.
Заметил один момент: в десятках выводились значения на единицу больше (например, вместо значения "10307" выводилось "10317").
Проблема решилась после того, как убрал "+1" из "/ 6 + 1" в вычислении десятков. Вот фрагмент:
ПО (customfieldvalue.STRINGVALUE = "10" 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВЫРАЗИТЬ(customfieldoption.ID * 0.06 КАК ЧИСЛО(18, 0)))) / 6 + 1, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВЫРАЗИТЬ(customfieldoption.ID * 0.6 КАК ЧИСЛО(18, 0)))) / 6, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 6)) / 6 + 1, 1))

Так что лучше перепроверить перед использованием этого метода.
Но мне все-равно очень пригодилось, спасибо.
21. ildarovich 7935 14.01.16 15:12 Сейчас в теме
(20) Sgeor, в тексте метода, приведенном в статье, никакого ВЫРАЗИТЬ нет. Этот оператор в этом случае не нужен, он лишний. То, что написано в (20) у меня совсем никак не работает.
Если же записать в точности так, как написано в статье:
ВЫБРАТЬ
	10307 КАК Id
ПОМЕСТИТЬ customfieldoption
;
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.0006)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.006)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.06)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 0.6)) / 6 + 1, 1)
+ 	ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Id * 6)) / 6 + 1, 1)
ИЗ
	customfieldoption КАК customfieldoption
Показать

то результат будет совершенно верный: "10307"
22. Sgeor 14.01.16 21:16 Сейчас в теме
(21) не при чем тут вообще "ВЫРАЗИТЬ" - это кусок давнишнего изврата и мракобесия=)
Тем не менее, я залез уже в консоль перепроверить и на сей раз вбил все чисто:
ВЫБРАТЬ
    customfieldoption.ID КАК До,
    "10" + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 0.06)) / 6 + 1, 1)
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 0.6 )) / 6 + 1, 1)
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, customfieldoption.ID * 6)) / 6 + 1, 1) КАК После
ИЗ
    ВнешнийИсточникДанных.JiraBasina.Таблица.customfieldoption КАК customfieldoption


Результат:
До----|--После
10300 | 10300
10301 | 10301
10302 | 10302
10303 | 10303
10304 | 10304
10305 | 10315
10306 | 10316
10307 | 10317
10308 | 10318
10309 | 10319

В итоге, если число в предыдущем разряде > 4, то прибавляется ненужная 1. Когда избавился от "+1" в вычислении десятков, все встало на свои места. Когда избавился от "+1" во всех разрядах, снова получил бред. А по твоему коду в (21) все в порядке. Магия.
Думается, что с ID-шниками в базе что-то странное? Нет - число как число.
23. ildarovich 7935 15.01.16 12:47 Сейчас в теме
(22) Sgeor, я, кажется, понял в чем дело. Есть правило определение точности результатов арифметических операций в запросе в зависимости от точности операндов. Они описаны в статье: Разрядность результатов выражений и агрегатных функций в языке запросов. Видимо, срабатывание этого правила приводит к необходимости привести результат customfieldoption.ID * 0.6 к целому типу! В результате производится не отбрасывание дробной части (как задумано в данном в статье выражении), а округление. Поэтому, видимо, нужно предварительно привести операнд к нужному типу, например, ВЫРАЗИТЬ(Id КАК Число(15, 1)).
Kabal; Sgeor; +2 Ответить
36. kasper076 111 15.06.17 14:05 Сейчас в теме
(35) В (23) Вы уже объясняли этот момент, но я не понял. В (35) гораздо понятнее. Мож еще кому понятнее будет. Спасибо.
24. selenat 01.02.16 12:02 Сейчас в теме
Добрый день. В базах на sql этот запрос нормально отрабатывает, а в базе на постгри - вылетает с ошибкой. Причем даже если делаю ПОДСТРОКА(""0123456789"", ВЫРАЗИТЬ(СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &Число * 0.06)) / 6 + 0.5 КАК ЧИСЛО(1, 0)), 1) (+0.5 использую, так как ВЫРАЗИТЬ округляет число, а не отбрасывает дробную часть)
как этому можно помочь?
25. ildarovich 7935 01.02.16 12:33 Сейчас в теме
(24) selenat, а платформа какая? Вообще с Postgre проблемы могут быть, буду разбираться, но быстро не обещаю.
26. selenat 01.02.16 13:33 Сейчас в теме
27. olbu 21.10.16 16:46 Сейчас в теме
Не могу сообразить, как имея таблицу дат в запросе и вот этот запрос
ВЫБРАТЬ
    ПОДСТРОКА("0123456789", ДЕНЬ(&Дата) / 10 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 1, 1) 
    + "/" 
    + ПОДСТРОКА("0123456789", МЕСЯЦ(&Дата) / 10 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 1, 1) 
    + "/" 
    + ПОДСТРОКА("0123456789", ГОД(&Дата) / 1000 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06)) / 6 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6)) / 6 + 1, 1) 
    + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6)) / 6 + 1, 1) КАК Строка
Показать


получить таблицу дат в строковом выражении?
28. ildarovich 7935 24.10.16 13:36 Сейчас в теме
(27) olbu, вам нужно написать запрос примерно такого вида:
ВЫБРАТЬ <СложноеВыражениеИзСтатьиГДЕПараметр&ДатаЗамененНаНужноеИмяПоляТаблицыДат> КАК ДатаВСтроковомВыражении ИЗ ТаблицаДатВЗапросе

Другими словами, в том поле, где требуется строковое представление даты, требуется записать сложное выражение из статьи, где вместо параметра &Дата указать имя поля таблицы, из которой выбираются даты.
29. user633312_i_vi 01.11.16 20:34 Сейчас в теме
ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293­031",ДЕНЬ(&Дата)*2-1,2)+"."
+ПОДСТРОКА("010203040506070809101112",МЕСЯЦ(&Дата)*2-1,2)+".201"
+ПОДСТРОКА("0123456789",ГОД(&Дата)-2010+1,1) КАК СтрДата
// Тоже не ахти но ...
DarkAn; jmi; +2 Ответить
30. ildarovich 7935 02.11.16 11:02 Сейчас в теме
(29) user633312_i_vi, хороший вариант. С месяцами вообще все хорошо, с годом - плохо.Дни - зависит от вкуса. Лично мне нравится. Возможно, стоит комбинировать в одном выражении оба этих подхода.
39. =Kollega= 5 10.10.17 09:47 Сейчас в теме
Расширив вариант (29) можно прийти к следующему:
ВЫБРАТЬ
	"00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899" КАК Ц
ПОМЕСТИТЬ Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	0 КАК Число
ПОМЕСТИТЬ Числа_0_9

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

ВЫБРАТЬ
	1

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

ВЫБРАТЬ
	2

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

ВЫБРАТЬ
	3

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

ВЫБРАТЬ
	4

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

ВЫБРАТЬ
	5

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

ВЫБРАТЬ
	6

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

ВЫБРАТЬ
	7

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

ВЫБРАТЬ
	8

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

ВЫБРАТЬ
	9

ИНДЕКСИРОВАТЬ ПО
	Число
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Старший.Число * 10 + Младший.Число КАК Число,
	ПОДСТРОКА(Константа.Ц, (Старший.Число * 10 + Младший.Число) * 2 + 1, 2) КАК Строка
ПОМЕСТИТЬ Числа_0_99
ИЗ
	Числа_0_9 КАК Младший,
	Числа_0_9 КАК Старший,
	Константа КАК Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА Числа_0_99.Число < 50
			ТОГДА 2000 + Числа_0_99.Число
		ИНАЧЕ 1900 + Числа_0_99.Число
	КОНЕЦ КАК Год,
	ВЫБОР
		КОГДА Числа_0_99.Число < 50
			ТОГДА "20" + ПОДСТРОКА(Константа.Ц, Числа_0_99.Число * 2 + 1, 2)
		ИНАЧЕ "19" + ПОДСТРОКА(Константа.Ц, Числа_0_99.Число * 2 + 1, 2)
	КОНЕЦ КАК ГодСтрокой
ПОМЕСТИТЬ Годы
ИЗ
	Числа_0_99 КАК Числа_0_99,
	Константа КАК Константа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Числа_0_99.Число КАК Число,
	Числа_0_99.Строка КАК Строка
ИЗ
	Числа_0_99 КАК Числа_0_99

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

ВЫБРАТЬ
	Годы.Год,
	Годы.ГодСтрокой
ИЗ
	Годы КАК Годы

УПОРЯДОЧИТЬ ПО
	Число
Показать

Используя одну констатнту можно переводить годы в интервале 100 лет (в примере с 1950 по 2049), месяцы, дни, часы, минуты и секунды.
76. user661255_lexxkrt 19.01.22 14:41 Сейчас в теме
(29)
ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293­031",ДЕНЬ(&Дата)*2-1,2)+"."
+ПОДСТРОКА("010203040506070809101112",МЕСЯЦ(&Дата)*2-1,2)+".201"
+ПОДСТРОКА("0123456789",ГОД(&Дата)-2010+1,1) КАК СтрДата


ВЫБРАТЬ
ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293­031",ДЕНЬ(&Дата)*2-1,2)+"."
+ПОДСТРОКА("010203040506070809101112",МЕСЯЦ(&Дата)*2-1,2)+"."
+ПОДСТРОКА("0123456789",Выразить(ГОД(&Дата)/1000-0.5 как число(1,0))+1,1)
+ПОДСТРОКА("0123456789",Выразить((ГОД(&Дата)-1000*(ВЫРАЗИТЬ(ГОД(&Дата)/1000-0.5 как Число(15,0))))/100-0.5 как число(1,0))+1,1)
+ПОДСТРОКА("0123456789",Выразить((ГОД(&Дата)-100*(ВЫРАЗИТЬ(ГОД(&Дата)/100-0.5 как Число(15,0))))/10-0.5 как число(1,0))+1,1)
+ПОДСТРОКА("0123456789",Выразить((ГОД(&Дата)-10*(ВЫРАЗИТЬ(ГОД(&Дата)/10-0.5 как Число(15,0))))-0.5 как число(1,0))+1,1) как Дата
31. Matveev_VS 166 22.05.17 13:12 Сейчас в теме
32. rpgshnik 3799 09.06.17 04:32 Сейчас в теме
34. kasper076 111 15.06.17 12:30 Сейчас в теме
При разрядности числа 10 знаков, 3 после запятой
ПОДСТРОКА(Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6000)) / 6 + 1, 1)

выдает пустую строку.
Из-за того, что получается слишком большое число &Число * 6000.
Этот момент уже разбирался, но я не смог найти где.
35. ildarovich 7935 15.06.17 13:57 Сейчас в теме
(34) Конечно, у "добавить к дате" есть ограничения на величину параметров. И &Число * 6000 не может быть слишком большим. Можно проверить, ограничение порядка 2^32, то есть четырехбайтовое целое.

Это ограничение приведенного приема.

В этом случае предлагается выделять младшую и старшую часть числа и переводить их по отдельности.

СтаршаяЧасть = ВЫРАЗИТЬ(&Число / 10000000, КАК Число(15, 0));
МладшаяЧасть = &Число - СтаршаяЧасть * 10000000.

Об этом написано в самой статье
Ограничением рассмотренного подхода является максимальное число секунд при работе с датами. Оно таково, что мы можем выделить не более 10-ти десятичных знаков в числе. Если число значащих знаков больше, исходное число потребуется предварительно разделить на две части «обычным» способом с использованием операции ВЫРАЗИТЬ КАК.
rpgshnik; +1 Ответить
37. trumanl 12 09.10.17 16:48 Сейчас в теме
Добрый день,
если не ошибаюсь ЧИСЛО(8, 2) это 123456.78,
а не 12345678,90
предложение
Приведем пример запроса для случая ЧИСЛО(8, 2)
"" надо исправить на ЧИСЛО(10,2)
38. ildarovich 7935 09.10.17 17:22 Сейчас в теме
(37) Спасибо за уточнение, поправил.
40. alex_sayan 53 16.10.17 06:48 Сейчас в теме
Идея интересная, но... Не дай бог встретить подобное в промышленной БД *представил, перекрестился и плюнул три раза через плечо*
43. AlexanderKai 19.10.17 09:57 Сейчас в теме
Вот как приходится изголяться 1Сникам, только потому что 1С не включила поддержку CAST.
48. RotaninV 24 09.04.18 04:57 Сейчас в теме
(43) что самое интересное, на 8.0, до 2-3 релиза он был и вполне себе работал.
45. redfox64 7 22.03.18 12:26 Сейчас в теме
Интересно что в Postgre получаю неверный год. Вместо 2018 - 2028.
46. ildarovich 7935 22.03.18 13:27 Сейчас в теме
(45) А что получается, если просто
ВЫБРАТЬ Год(&Дата)
47. redfox64 7 22.03.18 16:38 Сейчас в теме
49. IvanVL 41 05.06.18 09:10 Сейчас в теме
Ага, дошло, долго понять не мог "что функция СЕКУНДА фактически является функцией остатка от деления на 60 числа секунд",
как понял, все стало понятно.
50. bajiepka 06.07.18 16:02 Сейчас в теме
Попробовал последний запрос на PostgreSql (linux). Как и писалось выше работает некорректно, видимо из-за округления или характерного для этой субд механизма получения дат. Это ни в коем случае не попытка "обхаить". Будьте бдительны с PostgreSQL.
52. taasha25 13 26.09.18 13:45 Сейчас в теме
Спасибо! Мне пригодилось.
54. starik-2005 3091 21.01.19 12:08 Сейчас в теме
А вот возник вопрос: а как теперь из получившейся строки убрать лидирующие нули? Мне, например, нужен диапазон какой-то, который я вычислил. В итоге он может быть от какого-нить нуля до какого-нить миллиона, но выводить "00000001-1000000" - как-то некошерно, однако. Есть мысли на эту тему? Первое, что приходит в голову - это поиск минимального "ненуля" и подстрока от позиции ненуля до конца строки. Остается придумать, как оптимально найти первый ненуль.
55. golod 01.02.19 13:16 Сейчас в теме
Спасибо автору поста, очень помогли
56. falexru 7 07.02.19 12:08 Сейчас в теме
ВЫБРАТЬ
ВЫБОР
КОГДА Не ПОДСТРОКА(&Номер, 1, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 1, 10)
КОГДА Не ПОДСТРОКА(&Номер, 2, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 2, 9)
КОГДА Не ПОДСТРОКА(&Номер, 3, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 3, 8)
КОГДА Не ПОДСТРОКА(&Номер, 4, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 4, 7)
КОГДА Не ПОДСТРОКА(&Номер, 5, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 5, 6)
КОГДА Не ПОДСТРОКА(&Номер, 6, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 6, 5)
КОГДА Не ПОДСТРОКА(&Номер, 7, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 7, 4)
КОГДА Не ПОДСТРОКА(&Номер, 8, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 8, 3)
КОГДА Не ПОДСТРОКА(&Номер, 9, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 9, 2)
Иначе ПОДСТРОКА(&Номер, 10, 1)
КОНЕЦ КАК СтрокаБезЛидирующихНулей
starik-2005; +1 Ответить
57. antonkms88 27.05.19 02:10 Сейчас в теме
Запрос 1С округляет по математическим правилам. Поэтому, представленный перевод из даты в строку не всегда отрабатывает корректно. Пример: 29.08.1995
Добавил немного, чтобы округления возвращали необходимые значения.
ПОДСТРОКА(«0123456789», ДЕНЬ(&Дата) / 10 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 0.5, 1),
«/»,
ПОДСТРОКА(«0123456789», МЕСЯЦ(&Дата) / 10 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&Дата))) / 6 + 0.5, 1),
«/»,
ПОДСТРОКА(«0123456789», ГОД(&Дата) / 1000 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.06 — 0.5)) / 6 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 0.6 — 0.5)) / 6 + 0.5, 1),
ПОДСТРОКА(«0123456789», СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&Дата) * 6 — 0.5)) / 6 + 0.5, 1)
60. ildarovich 7935 29.08.19 14:59 Сейчас в теме
(57) Не могу подтвердить.
У меня, наоборот, мой код из статьи дает на примере 29.08.1995 совершенно верный результат, а ваш код дает 28/07/1984 на этих данных.
Нужно разобраться. Принцип округления при составлении запроса учитывался. И запрос тестировался. Правда, не на Постгри.
63. antonkms88 30.08.19 15:22 Сейчас в теме
(60)
Да, от СУБД, судя по всему, зависит.
В приложении 2 картинки. Одна картинка - серверная база с СУБД Postg, другая картинка - файловая база.
Результаты полностью противоположные.
Прикрепленные файлы:
58. OksDallas 22 11.06.19 07:33 Сейчас в теме
Внесу свои пять копеек по преобразованию даты в строку
Запрос = Новый Запрос;

Запрос.Текст = 
"ВЫБРАТЬ
|	ОтзывыИзОтпуска.Сотрудник КАК Сотрудник,
|	ОтзывыИзОтпуска.ПриказОбОтзыве,
|	ДЕНЬ(ОтзывыИзОтпуска.Период) КАК День,
|	МЕСЯЦ(ОтзывыИзОтпуска.Период) КАК Месяц,
|	ГОД(ОтзывыИзОтпуска.Период) - 2000 КАК Год
|ПОМЕСТИТЬ ВТ_ОтпускСОтзывами
|ИЗ
|	РегистрСведений.ОтзывыИзОтпуска КАК ОтзывыИзОтпуска
|ГДЕ
|	ОтзывыИзОтпуска.Сотрудник В(&Сотрудник)
|
|ИНДЕКСИРОВАТЬ ПО
|	Сотрудник
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТ_ОтпускСОтзывами.Сотрудник,
|	""Пр.№ "" + ВТ_ОтпускСОтзывами.ПриказОбОтзыве + "" от "" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.День < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День + 1, 1)
|		КОГДА ВТ_ОтпускСОтзывами.День < 20
|			ТОГДА ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 9, 1)
|		КОГДА ВТ_ОтпускСОтзывами.День < 30
|			ТОГДА ""2"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 19, 1)
|		ИНАЧЕ ""3"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 29, 1)
|	КОНЕЦ + ""."" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.Месяц < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Месяц + 1, 1)
|		ИНАЧЕ ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Месяц - 9, 1)
|	КОНЕЦ + "".20"" + ВЫБОР
|		КОГДА ВТ_ОтпускСОтзывами.Год < 10
|			ТОГДА ""0"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год + 1, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 20
|			ТОГДА ""1"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 9, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 30
|			ТОГДА ""2"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 19, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 40
|			ТОГДА ""3"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 29, 1)
|		КОГДА ВТ_ОтпускСОтзывами.Год < 50
|			ТОГДА ""4"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.Год - 39, 1)
|		ИНАЧЕ ""5"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 49, 1)
|	КОНЕЦ + "" г."" КАК Приказ
|ИЗ
|	ВТ_ОтпускСОтзывами КАК ВТ_ОтпускСОтзывами";

Запрос.УстановитьПараметр("Циферки", "0123456789");
Показать
vis_tmp; Devi; acanta; jura_b; ildarovich; +5 Ответить
85. vis_tmp 32 06.02.24 11:58 Сейчас в теме
(58)
ИНАЧЕ ""5"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.День - 49, 1)

тут надо ГОД:
ИНАЧЕ ""5"" + ПОДСТРОКА(&Циферки, ВТ_ОтпускСОтзывами.ГОД - 49, 1)
OksDallas; +1 Ответить
59. YalanchidiO 20 28.08.19 14:04 Сейчас в теме
Передо мной стояла задача вывести время двух документов через "-". Должно было получиться, например, "15:08 - 16:05". Выводить необходимо было данные в динамический список, поэтому делать нужно было вычисление этого выражения в запросе. Спасибо большое за идею, но столкнулась с тем, что число в запросе в любом случае округляется по арифметическим правилам, то есть 1,8 = 2 , как ни крути)

Возможно, мой код оказался громоздким, но он работает)

ВЫБОР
	КОГДА ЧАС(ЗаказКлиента.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА ЧАС(ЗаказКлиента.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА ЧАС(ЗаказКлиента.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА ЧАС(ЗаказКлиента.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА ЧАС(ЗаказКлиента.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", ЧАС(ЗаказКлиента.Дата) / 10 + 1, 1)
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ЗаказКлиента.Дата))) / 6 + 1, 1) + ":" + ВЫБОР
	КОГДА МИНУТА(ЗаказКлиента.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА МИНУТА(ЗаказКлиента.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА МИНУТА(ЗаказКлиента.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА МИНУТА(ЗаказКлиента.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА МИНУТА(ЗаказКлиента.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
									ИНАЧЕ ВЫБОР
											КОГДА МИНУТА(ЗаказКлиента.Дата) <= 29
												ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
											ИНАЧЕ ВЫБОР
													КОГДА МИНУТА(ЗаказКлиента.Дата) <= 34
														ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
													ИНАЧЕ ВЫБОР
															КОГДА МИНУТА(ЗаказКлиента.Дата) <= 39
																ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
															ИНАЧЕ ВЫБОР
																	КОГДА МИНУТА(ЗаказКлиента.Дата) <= 44
																		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
																	ИНАЧЕ ВЫБОР
																			КОГДА МИНУТА(ЗаказКлиента.Дата) <= 49
																				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
																			ИНАЧЕ ВЫБОР
																					КОГДА МИНУТА(ЗаказКлиента.Дата) <= 54
																						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10 + 1, 1)
																					ИНАЧЕ ПОДСТРОКА("0123456789", МИНУТА(ЗаказКлиента.Дата) / 10, 1)
																				КОНЕЦ
																		КОНЕЦ
																КОНЕЦ
														КОНЕЦ
												КОНЕЦ
										КОНЕЦ
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ЗаказКлиента.Дата))) / 6 + 1, 1) + " - " + ВЫБОР
	КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА ЧАС(ВложенныйЗапрос2.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", ЧАС(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВложенныйЗапрос2.Дата))) / 6 + 1, 1) + ":" + ВЫБОР
	КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 4
		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
	ИНАЧЕ ВЫБОР
			КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 9
				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
			ИНАЧЕ ВЫБОР
					КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 14
						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
					ИНАЧЕ ВЫБОР
							КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 19
								ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
							ИНАЧЕ ВЫБОР
									КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 24
										ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
									ИНАЧЕ ВЫБОР
											КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 29
												ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
											ИНАЧЕ ВЫБОР
													КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 34
														ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
													ИНАЧЕ ВЫБОР
															КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 39
																ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
															ИНАЧЕ ВЫБОР
																	КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 44
																		ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
																	ИНАЧЕ ВЫБОР
																			КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 49
																				ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
																			ИНАЧЕ ВЫБОР
																					КОГДА МИНУТА(ВложенныйЗапрос2.Дата) <= 54
																						ТОГДА ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10 + 1, 1)
																					ИНАЧЕ ПОДСТРОКА("0123456789", МИНУТА(ВложенныйЗапрос2.Дата) / 10, 1)
																				КОНЕЦ
																		КОНЕЦ
																КОНЕЦ
														КОНЕЦ
												КОНЕЦ
										КОНЕЦ
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ
		КОНЕЦ
КОНЕЦ + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВложенныйЗапрос2.Дата))) / 6 + 1, 1)
Показать
Прикрепленные файлы:
61. ildarovich 7935 29.08.19 15:05 Сейчас в теме
(59) Хочу разобраться: чем не устроил запрос из статьи? Способ округления я учитывал, когда составлял запрос и тестировал подход, но все может быть...
Какая у вас СУБД? Давайте я протестирую свой подход на ваших данных (нужно немного времени). Вообще я против такой громоздкости, даже если она работает.
62. ildarovich 7935 29.08.19 15:59 Сейчас в теме
(59) + (61) Вот запрос с вашими данными
ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 44, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 44, 0) КАК Дата2 ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 46, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 47, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 20, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 21, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 25, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 57, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 18, 09, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 18, 13, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 09, 23, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 10, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 59, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 29, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 51, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 15, 58, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 59, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 29, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 15, 00, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 15, 37, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 44, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 59, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 36, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 14, 42, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 14, 21, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 16, 53, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 40, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 41, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 13, 18, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 42, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 53, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 13, 01, 0) КАК Дата2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1, 11, 07, 0) КАК Дата1, ДАТАВРЕМЯ(1, 1, 1, 11, 31, 0) КАК Дата2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ЧАС(ВТ.Дата1) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВТ.Дата1))) / 6 + 1, 1) 
	+ ":" + ПОДСТРОКА("0123456789", МИНУТА(ВТ.Дата1) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВТ.Дата1))) / 6 + 1, 1) 
	+ "-" 
	+ ПОДСТРОКА("0123456789", ЧАС(ВТ.Дата2) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ЧАС(ВТ.Дата2))) / 6 + 1, 1) 
	+ ":" + ПОДСТРОКА("0123456789", МИНУТА(ВТ.Дата2) / 10 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МИНУТА(ВТ.Дата2))) / 6 + 1, 1) КАК Строка
ИЗ
	ВТ КАК ВТ
Показать
Прикрепленные файлы:
64. Aleks9111 29.10.19 19:26 Сейчас в теме
Публикация скоро 5-и летний юбилей будет праздновать.. а мы до сих пор обкладываемся костылями чтобы преобразовать число или дату в строку. Отстаем, лет на 20
65. _Sedoy 25.11.19 17:19 Сейчас в теме
Может я что-то не понимаю, но...
Функция ПРЕДСТАВЛЕНИЕ
Данная функция предназначена для получения строкового представления значения произвольного типа.

Параметр функции – выражение любого типа.

Возвращаемое значение – представление значения, тип СТРОКА.

Результат работы функции не может быть использован внутри других функций, за исключением функции ПРЕДСТАВЛЕНИЕ.

Пример:
ВЫБРАТЬ
   ПРЕДСТАВЛЕНИЕ(РасхНакл.Получатель) КАК ПолучательСтрокой,
   ПРЕДСТАВЛЕНИЕ(РасхНакл.Дата) КАК ДатаСтрокой
ИЗ
   Документ.РасхНакл КАК РасхНакл
66. PolSerg 11.02.20 12:03 Сейчас в теме
Промучавшись с этим решением понял что проблемы математического округления возникают при делении получившегося числа на 6, вот код который верно отрабатывает:

ВЫБРАТЬ
    ПОДСТРОКА(Ц, &Число / 10000000 + 1, 1) 
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.000006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.00006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.0006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.006)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.06)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 0.6)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 6)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + "." 
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 60)) / 6-0.4999999999 + 1 как число(1,0)), 1)
    + ПОДСТРОКА(Ц, выразить(СЕКУНДА(ДОБАВИТЬКДАТЕ(О, СЕКУНДА, &Число * 600)) / 6-0.4999999999 + 1 как число(1,0)), 1)
ИЗ (ВЫБРАТЬ "0123456789" Ц, ДАТАВРЕМЯ(1, 1, 1) О) КАК Константы
Показать
67. mark_oilbass 25.03.20 08:58 Сейчас в теме
Есть у кого нибудь пример текста запроса в случаи если число используется с 14 цифрами?
68. Rusel 26.03.20 14:29 Сейчас в теме
Запрос выдаёт разные результаты в зависимости от используемой СУБД.

На файловой и MSSQL результат всегда правильный.
На PostgreSQL иногда правильный, иногда неправильный.
Создал обработку для проверки правильности — см. прикреплена.

Например, в PostgreSQL дата 25.08.2019 выводится как "35.18.2029", а 03.01.2020 выводится правильно как "03.01.2020".
Версия PostgreSQL 9.4.2-1.1C(x64)
Возможно, в новой версии PostgreSQL поведение другое, не проверял.

Пример запроса:

ВЫБРАТЬ
    Т.Дата КАК Дата,
    ПОДСТРОКА("0123456789", Т.ДД / 10 + 1, 1) 
        + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * Т.ДД)) / 6 + 1, 1) 
        + "." 
        + ПОДСТРОКА("0123456789", Т.ММ / 10 + 1, 1) 
        + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * Т.ММ)) / 6 + 1, 1) 
        + "." 
        + ПОДСТРОКА("0123456789", Т.ГГ / 1000 + 1, 1) 
        + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Т.ГГ * 0.06)) / 6 + 1, 1) 
        + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Т.ГГ * 0.6)) / 6 + 1, 1) 
        + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Т.ГГ * 6)) / 6 + 1, 1) КАК ДатаСтрокой
ИЗ
    (ВЫБРАТЬ ДАТАВРЕМЯ(2019, 8, 1) КАК Дата, 2019 КАК ГГ, 8 КАК ММ, 1 КАК ДД
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  2), 2019,  8,  2
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  3), 2019,  8,  3
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  4), 2019,  8,  4
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  5), 2019,  8,  5
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  6), 2019,  8,  6
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  7), 2019,  8,  7
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  8), 2019,  8,  8
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8,  9), 2019,  8,  9
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 10), 2019,  8, 10
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 11), 2019,  8, 11
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 12), 2019,  8, 12
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 13), 2019,  8, 13
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 14), 2019,  8, 14
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 15), 2019,  8, 15
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 16), 2019,  8, 16
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 17), 2019,  8, 17
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 18), 2019,  8, 18
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 19), 2019,  8, 19
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 20), 2019,  8, 20
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 21), 2019,  8, 21
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 22), 2019,  8, 22
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 23), 2019,  8, 23
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 24), 2019,  8, 24
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 25), 2019,  8, 25
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 26), 2019,  8, 26
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 27), 2019,  8, 27
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 28), 2019,  8, 28
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 29), 2019,  8, 29
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 30), 2019,  8, 30
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019,  8, 31), 2019,  8, 31) КАК Т
Показать
Прикрепленные файлы:
ПроверкаПреобразованияДатыВСтрокуВЗапросе.epf
80. user774881 27.04.23 21:43 Сейчас в теме
(68) Уперся в такую же проблему
РЕШЕНИЕ:
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ДЕНЬ(&ДатаПроизводства) / 10 + 0.5, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&ДатаПроизводства))) / 6 + 1, 1) 
	+ "." + ПОДСТРОКА("0123456789", МЕСЯЦ(&ДатаПроизводства) / 10 + 0.5, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(&ДатаПроизводства))) / 6 + 1, 1) 
	+ "." + ПОДСТРОКА("0123456789", ГОД(&ДатаПроизводства) / 1000 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&ДатаПроизводства) * 0.06)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&ДатаПроизводства) * 0.6)) / 6 + 1, 1) 
	+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ГОД(&ДатаПроизводства) * 6)) / 6 + 1, 1) КАК ДатаСтрокой
Показать
83. vis_tmp 32 06.02.24 09:14 Сейчас в теме
(80)Такой запрос в файловой базе и на MS SQL тоже правильно работает?
84. vis_tmp 32 06.02.24 09:24 Сейчас в теме
(80)Не получается... дату "02.01.2025" преобразует в "02.01.2035".
69. starik-2005 3091 17.06.21 15:30 Сейчас в теме
Дошел в очередной раз до практического применения подобного механизма. Так вот описанный в статье подход с датами работает только для 19-ти строк выборки (например, вы хотите числовой код ОКАТО преобразовать в строку), а если строк больше - ругается на переполнение на SQL-сервере (MS SQL, overflow). При том "обычное" преобразование работает (с делением на число, кратное 10-ти).

Кто-нить разбирался, в чем тут проблема со стороны SQL-сервра?
70. ildarovich 7935 17.06.21 15:41 Сейчас в теме
(69) в (35) и в самой статье написано, что есть ограничение на величину числа из-за того, что число секунд не может быть больше 2^32. Там же говорится, что выход в делении на старшую и младшую часть большого числа и приведена формула для этого.

Если я правильно понял вопрос.
71. starik-2005 3091 17.06.21 15:52 Сейчас в теме
(70)
Если я правильно понял вопрос.
Мне кажется, что неверно вопрос понят.

Дано:
1. Таблица с полем КОД, между 1 и 1000 (я в запросе так и написал ГДЕ КОД МЕЖДУ 1 И 1000) - много регионов нашей необъятной родины.
2. Преобразование с датой.

Итог:
1. Если ВЫБРАТЬ ПЕРВЫЕ 19 - все ок.
2. Если ВЫБРАТЬ ПЕРВЫЕ 20 - overflow.

MS SQL SERVER.
72. ildarovich 7935 17.06.21 16:00 Сейчас в теме
(71) Да, неправильно понял, но тогда, чтобы разобраться, нужен весь запрос.

Вроде бы этот прием никак отдельные преобразуемые строки не связывает, ни прямо не косвенно, накопления никакого нет, поэтому эффект очень странный.

Думаю, проблема в какой-то обвязке, забытом условии соединения и т.п.
73. starik-2005 3091 17.06.21 16:15 Сейчас в теме
(72)
Думаю, проблема в какой-то обвязке, забытом условии соединения и т.п.
По всей видимости так и есть, ибо еще раз после перезапуска сервера запустил и - опа - заработало. Какой-то баг...

ВЫБРАТЬ
	ПОДСТРОКА(Константы.Ц, Территории.Код / 1000 + 1, 1) +
	ПОДСТРОКА(Константы.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(Константы.О, СЕКУНДА, Территории.Код * 0.06)) / 6 + 1, 1) + 
	ПОДСТРОКА(Константы.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(Константы.О, СЕКУНДА, Территории.Код * 0.6)) / 6 + 1, 1) + 
	ПОДСТРОКА(Константы.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(Константы.О, СЕКУНДА, Территории.Код * 6)) / 6 + 1, 1) КАК Поле1
ИЗ
	(ВЫБРАТЬ
		"0123456789" КАК Ц,
		ДАТАВРЕМЯ(1, 1, 1) КАК О) КАК Константы,
	Справочник.Территории КАК Территории
ГДЕ КОД МЕЖДУ 1 И 1000
Показать
75. -AI- 13.01.22 10:23 Сейчас в теме
предложу свой вариант, для даты:
ВЫБРАТЬ 0 как число, "0" как строка
ПОМЕСТИТЬ цифры
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "1"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "2"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "3"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, "4"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5, "5"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6, "6"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7, "7"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, "8"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, "9"
;
ВЫБРАТЬ
	цифра4.число*1000 + цифра3.число*100 + цифра2.число*10 + цифра1.число КАК число,
	цифра4.строка + цифра3.строка + цифра2.строка + цифра1.строка КАК строка
ПОМЕСТИТЬ годы
ИЗ цифры как цифра1, цифры как цифра2, цифры как цифра3, цифры как цифра4
ИНДЕКСИРОВАТЬ ПО число
;
ВЫБРАТЬ
	Ссылка,
	зк.Номер + " от " // + Представление(зк.Дата)
	+ Подстрока("01020304050607080910111213141516171819202122232425262728293­031", День(зк.Дата)*2-1,2)
	+ "." + Подстрока("010203040506070809101112", МЕСЯЦ(зк.Дата)*2-1, 2)
	+ "." + годы.строка
	+ " " + Подстрока("000102030405060708091011121314151617181920212223", Час(зк.Дата)*2+1,2)
	+ ":" + Подстрока("00010203040506070809101112131415161718192021222324252627282­930313233343536373839404142434445464748495051525354555657585­9", Минута(зк.Дата)*2+1,2)
	+ ":" + Подстрока("00010203040506070809101112131415161718192021222324252627282­930313233343536373839404142434445464748495051525354555657585­9", Секунда(зк.Дата)*2+1,2)
	КАК КраткоеПреставление
ИЗ
	Документ.ЗаказКлиента как зк
		ЛЕВОЕ СОЕДИНЕНИЕ
	годы
		ПО годы.число = Год(зк.Дата)
Показать
PS форум рубит длинную строку с цифрами, её надо писать в одну строку
77. 1cNBL 27.07.22 08:58 Сейчас в теме
А так не проще?

Выбрать Строка(&Дата)
79. PuchM 23.08.22 23:39 Сейчас в теме
Пример для даты

ВЫБРАТЬ
	"№ " + СчетНаОплатуПокупателю.Номер + " от " + ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293­031", ДЕНЬ(СчетНаОплатуПокупателю.Дата) * 2 - 1, 2) + "." + ПОДСТРОКА("010203040506070809101112", МЕСЯЦ(СчетНаОплатуПокупателю.Дата) * 2 - 1, 2) + "." + ПОДСТРОКА("20202021202220232024202520262027202820292030", (ГОД(СчетНаОплатуПокупателю.Дата) - 2020) * 4 + 1, 4) КАК ДатаСтрока
ИЗ
	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ГДЕ
	СчетНаОплатуПокупателю.Ссылка = &Ссылка
KillerMann; +1 Ответить
81. mc2 18 07.07.23 18:58 Сейчас в теме
Гениально! Огромное спасибо! Очень пригодилось!
82. e9504100606 92 30.10.23 13:20 Сейчас в теме
Спасибо. В решении есть 2 проблемы:
1. пишет лидирующие нули
2. не пишет нули в конце, например, 10 = "1", а не "10"
Исправил. Для задачи требовалось только для положительных числа (количество строк в ТЧ):

ВЫБРАТЬ 12345 КАК Поле1 
ПОМЕСТИТЬ ВременнаяТаблица
объединить все 
ВЫБРАТЬ 100
объединить все 
ВЫБРАТЬ 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА Т.Поле1 = 0
    ТОГДА "0"
ИНАЧЕ ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, Т.Поле1 / 100000 + 1, 1) = "0"
            ТОГДА ""
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, Т.Поле1 / 100000 + 1, 1)
    КОНЕЦ + ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.0006)) / 6 + 1, 1) = "0"
            ТОГДА ВЫБОР
                    КОГДА Т.Поле1 < 100000
                        ТОГДА ""
                    ИНАЧЕ "0"
                КОНЕЦ
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.0006)) / 6 + 1, 1)
    КОНЕЦ + ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.006)) / 6 + 1, 1) = "0"
            ТОГДА ВЫБОР
                    КОГДА Т.Поле1 < 10000
                        ТОГДА ""
                    ИНАЧЕ "0"
                КОНЕЦ
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.006)) / 6 + 1, 1)
    КОНЕЦ + ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.06)) / 6 + 1, 1) = "0"
            ТОГДА ВЫБОР
                    КОГДА Т.Поле1 < 1000
                        ТОГДА ""
                    ИНАЧЕ "0"
                КОНЕЦ
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.06)) / 6 + 1, 1)
    КОНЕЦ + ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.6)) / 6 + 1, 1) = "0"
            ТОГДА ВЫБОР
                    КОГДА Т.Поле1 < 100
                        ТОГДА ""
                    ИНАЧЕ "0"
                КОНЕЦ
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 0.6)) / 6 + 1, 1)
    КОНЕЦ + ВЫБОР
        КОГДА ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 6)) / 6 + 1, 1) = "0"
            ТОГДА ВЫБОР
                    КОГДА Т.Поле1 < 10
                        ТОГДА ""
                    ИНАЧЕ "0"
                КОНЕЦ
        ИНАЧЕ ПОДСТРОКА(ЧД.Ч, СЕКУНДА(ДОБАВИТЬКДАТЕ(ЧД.Д, СЕКУНДА, Т.Поле1 * 6)) / 6 + 1, 1)
    КОНЕЦ
КОНЕЦ КАК Поле1
ИЗ
    ВременнаяТаблица КАК Т,
    (ВЫБРАТЬ
        "0123456789" КАК Ч,
        ДАТАВРЕМЯ(1, 1, 1) КАК Д) КАК ЧД
Показать
86. user663675_oamaris75 10.08.24 18:17 Сейчас в теме
Можно гораздо проще для даты
ВЫБОР КОГДА ДЕНЬ(ФизическиеЛица.ДатаРождения)<10 ТОГДА
"0"+ПОДСТРОКА("0123456789", ДЕНЬ(ФизическиеЛица.ДатаРождения) + 1, 1)
ИНАЧЕ ПОДСТРОКА("0123456789",ДЕНЬ(ФизическиеЛица.ДатаРождения)/10+1,1)+
ПОДСТРОКА("0123456789",ДЕНЬ(ФизическиеЛица.ДатаРождения)-ВЫРАЗИТЬ(ДЕНЬ(ФизическиеЛица.ДатаРождения)/10-0.5 КАК ЧИСЛО(1))*10+1,1)
КОНЕЦ +"/"+
ВЫБОР КОГДА МЕСЯЦ(ФизическиеЛица.ДатаРождения)<10 ТОГДА "0"+
ПОДСТРОКА("0123456789",МЕСЯЦ(ФизическиеЛица.ДатаРождения)+1,1)
ИНАЧЕ
ПОДСТРОКА("0123456789",МЕСЯЦ(ФизическиеЛица.ДатаРождения)/10+1,1)+
ПОДСТРОКА("0123456789",МЕСЯЦ(ФизическиеЛица.ДатаРождения)-ВЫРАЗИТЬ(МЕСЯЦ(ФизическиеЛица.ДатаРождения)/10 КАК ЧИСЛО(1,0))*10+1,1)
КОНЕЦ +"/"+
ПОДСТРОКА("0123456789",ВЫРАЗИТЬ(ГОД(ФизическиеЛица.ДатаРождения)/1000-0.5 КАК ЧИСЛО(1))+1,1)+
ПОДСТРОКА("0123456789",(ГОД(ФизическиеЛица.ДатаРождения)-1000*ВЫРАЗИТЬ(ГОД(ФизическиеЛица.ДатаРождения)/1000-0.5 КАК ЧИСЛО(1)))/100+1,1)+
ПОДСТРОКА("0123456789",(ГОД(ФизическиеЛица.ДатаРождения)- 100*ВЫРАЗИТЬ(ГОД(ФизическиеЛица.ДатаРождения)/100-0.5 КАК ЧИСЛО(2)))/10+1,1)+
ПОДСТРОКА("0123456789",(ГОД(ФизическиеЛица.ДатаРождения)- 10*ВЫРАЗИТЬ(ГОД(ФизическиеЛица.ДатаРождения)/10-0.5 КАК ЧИСЛО(3)))+1,1),
87. user883129 03.10.24 15:46 Сейчас в теме
ВЫБРАТЬ
СТРОКА(ДатаРождения) - вернет вам желанную строку.
Оставьте свое сообщение