Подстрока к дате в запросе, дата без времени

1. Evgeniia_S 06.02.21 16:17 Сейчас в теме
Уже многократно поднимался похожий вопрос на форуме, но мне трудно поверить, что это невозможно.
У меня есть ТЗ, выгруженная из запроса, которая сразу преобразуется в csv общими функциями, как колонки вывела в запросе - то и получила в результате. И совсем бы не хотелось дополнительно после выгрузки из запроса эту ТЗ обрабатывать.

Мне всего лишь нужна дата без времени.

У меня есть временная таблица и выборка из неё. Наглядно что я пытаюсь сделать. Я хочу получить дату без времени без громоздких конструкций. Пробовала отдельно Год, День, Месяц, но эти числа не превратить в строку

ВЫБРАТЬ  
     ПРЕДСТАВЛЕНИЕ(РеестрОтгрузки.Дата)  ДатаРеестра
Поместить ЗаказыЗаПериод
.....
;
ВЫБРАТЬ 
     Подстрока(ДатаРеестра,1,10) КАК ДокументДата
ИЗ ЗаказыЗаПериод


Может, ему как-то convert можно подсунуть?
По теме из базы знаний
Найденные решения
11. rule_2 47 10.02.21 04:55 Сейчас в теме
В общем, ГОРАЗДО проще, но, возможно, медленнее, будет обрабатывать результат запроса программно. Там можно будет дату в строку перевести, по точкам разложить и т.п. Но раз уж хочется в запросе, то вот запрос.

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) КАК Дата,
	ГОД(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)) КАК Год
ПОМЕСТИТЬ ВТДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДата.Дата КАК Дата,
	ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) > ВТДата.Год / 1000
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))
	КОНЕЦ КАК ПервоеЧислоГода,
	(ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) > ВТДата.Год / 1000
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))
	КОНЕЦ * 1000 - (ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) > ВТДата.Год / 100
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))
	КОНЕЦ * 100)) / 100 КАК ВтороеЧислоГода,
	(ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) > ВТДата.Год / 100
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))
	КОНЕЦ * 100 - (ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) > ВТДата.Год / 10
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))
	КОНЕЦ * 10)) / 10 КАК ТретьеЧислоГода,
	ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) > ВТДата.Год / 10
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))
	КОНЕЦ * 10 КАК ЧетвертоеЧислоГода
ПОМЕСТИТЬ ВТДатаСЧисламиГода
ИЗ
	ВТДата КАК ВТДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ВЫБОР
			КОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > ДЕНЬ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ + 1, 1) + ПОДСТРОКА("0123456789", ДЕНЬ(ВТДата.Дата) - ВЫБОР
			КОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > ДЕНЬ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ * 10 + 1, 1) КАК ДеньМесяца,
	ПОДСТРОКА("0123456789", ВЫБОР
			КОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > МЕСЯЦ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ + 1, 1) + ПОДСТРОКА("0123456789", МЕСЯЦ(ВТДата.Дата) - ВЫБОР
			КОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > МЕСЯЦ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ * 10 + 1, 1) КАК Месяц,
	ПОДСТРОКА("0123456789", ВТДата.ПервоеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ВтороеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ТретьеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ЧетвертоеЧислоГода + 1, 1) КАК Год
ИЗ
	ВТДатаСЧисламиГода КАК ВТДата
Показать


Пояснения:
1. Здесь чисто операции с числами (которые получены в результате встроенных функций ДЕНЬ, МЕСЯЦ, ГОД), их деление, округление и получение остатков от деления. Через оператор ВЫБОР сделано, т.к. нужно учитывать округление в большую сторону, например, когда 1934 мы делим на 1000, с округлением получаем 2, а надо 1.
2. Те места, где ПОДСТРОКА, устанавливается +1, т.к. сама строка, из которой берутся символы, начинается с нуля, а индексы символов - с 1, т.е. если у нас число 0, и нам нужно получить символ "0", то нужно брать первый символ строки.
3. Сделал с временными таблицами, т.к. если делать вложенный запрос, и без того громоздкий и тяжелый для чтения запрос станет совсем нечитаемым. К тому же, в результирующей таблице я вывел отдельно день, месяц и год. Нужно будет их еще склеить с нужным разделителем, но это не сложно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sergex 58 06.02.21 17:04 Сейчас в теме
(3) Простых решений преобразования дат в строку нет.

Есть сложные: https://infostart.ru/1c/articles/331805/
3. burgomister 59 06.02.21 17:28 Сейчас в теме
НАЧАЛОПЕРИОДА(РеестрОтгрузки.Дата, ДЕНЬ) КАК ДатаБезМинут
4. ixijixi 1801 06.02.21 17:29 Сейчас в теме
Вот такой запрос даст нужный результат. Это не строка, но дата без чч:мм:сс
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ЕСТЬNULL(НАЧАЛОПЕРИОДА(ЗаказКлиента.Дата, ДЕНЬ), "") КАК Дата
ИЗ
	Документ.ЗаказКлиента КАК ЗаказКлиента
Прикрепленные файлы:
7. Evgeniia_S 06.02.21 20:59 Сейчас в теме
(4)
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЕСТЬNULL(НАЧАЛОПЕРИОДА(ЗаказКлиента.Дата, ДЕНЬ), "") КАК Дата
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента



Не даст, у него просто 00:00:00 в чч:мм:сс, которые присутствуют в результате выборки. Не знаю, почему у Вас результат отобразил без времени, какое-то отображение 1С видимо. У меня 05.01.2021 00:00:00
6. Evgeniia_S 06.02.21 20:55 Сейчас в теме
НачалоПериода мне не подходит, так как система, в которую мы выгружаем, не поймет дату более 10 символов.

Выбрала следующий вариант:

День:
ПОДСТРОКА("0123456789", ДЕНЬ(&Дата) / 10 + 0.5, 1),
ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(&Дата))) / 6 + 0.5, 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) КАК Строка


Сложить с нужными разделителями. Написала отдельно, потому что есть вопросы в +1 и +0,5. При +1 в дне у меня получался неправильный день. Я не до конца поняла этот алгоритм.
8. Evgeniia_S 06.02.21 21:01 Сейчас в теме
Давайте попросим разработчиков 1С реализовать convert (
9. and_sk 14 07.02.21 11:06 Сейчас в теме
если подстрока(выразить (дата как строка...
не прокатит?
10. ixijixi 1801 07.02.21 14:30 Сейчас в теме
(9) Неа( Можешь сам в консоли проверить
11. rule_2 47 10.02.21 04:55 Сейчас в теме
В общем, ГОРАЗДО проще, но, возможно, медленнее, будет обрабатывать результат запроса программно. Там можно будет дату в строку перевести, по точкам разложить и т.п. Но раз уж хочется в запросе, то вот запрос.

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) КАК Дата,
	ГОД(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)) КАК Год
ПОМЕСТИТЬ ВТДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДата.Дата КАК Дата,
	ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) > ВТДата.Год / 1000
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))
	КОНЕЦ КАК ПервоеЧислоГода,
	(ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) > ВТДата.Год / 1000
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 1000 КАК ЧИСЛО(1, 0))
	КОНЕЦ * 1000 - (ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) > ВТДата.Год / 100
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))
	КОНЕЦ * 100)) / 100 КАК ВтороеЧислоГода,
	(ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) > ВТДата.Год / 100
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 100 КАК ЧИСЛО(2, 0))
	КОНЕЦ * 100 - (ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) > ВТДата.Год / 10
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))
	КОНЕЦ * 10)) / 10 КАК ТретьеЧислоГода,
	ВТДата.Год - ВЫБОР
		КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) > ВТДата.Год / 10
			ТОГДА (ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))) - 1
		ИНАЧЕ ВЫРАЗИТЬ(ВТДата.Год / 10 КАК ЧИСЛО(3, 0))
	КОНЕЦ * 10 КАК ЧетвертоеЧислоГода
ПОМЕСТИТЬ ВТДатаСЧисламиГода
ИЗ
	ВТДата КАК ВТДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", ВЫБОР
			КОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > ДЕНЬ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ + 1, 1) + ПОДСТРОКА("0123456789", ДЕНЬ(ВТДата.Дата) - ВЫБОР
			КОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > ДЕНЬ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(ДЕНЬ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ * 10 + 1, 1) КАК ДеньМесяца,
	ПОДСТРОКА("0123456789", ВЫБОР
			КОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > МЕСЯЦ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ + 1, 1) + ПОДСТРОКА("0123456789", МЕСЯЦ(ВТДата.Дата) - ВЫБОР
			КОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) > МЕСЯЦ(ВТДата.Дата) / 10
				ТОГДА (ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))) - 1
			ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(ВТДата.Дата) / 10 КАК ЧИСЛО(1, 0))
		КОНЕЦ * 10 + 1, 1) КАК Месяц,
	ПОДСТРОКА("0123456789", ВТДата.ПервоеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ВтороеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ТретьеЧислоГода + 1, 1) + ПОДСТРОКА("0123456789", ВТДата.ЧетвертоеЧислоГода + 1, 1) КАК Год
ИЗ
	ВТДатаСЧисламиГода КАК ВТДата
Показать


Пояснения:
1. Здесь чисто операции с числами (которые получены в результате встроенных функций ДЕНЬ, МЕСЯЦ, ГОД), их деление, округление и получение остатков от деления. Через оператор ВЫБОР сделано, т.к. нужно учитывать округление в большую сторону, например, когда 1934 мы делим на 1000, с округлением получаем 2, а надо 1.
2. Те места, где ПОДСТРОКА, устанавливается +1, т.к. сама строка, из которой берутся символы, начинается с нуля, а индексы символов - с 1, т.е. если у нас число 0, и нам нужно получить символ "0", то нужно брать первый символ строки.
3. Сделал с временными таблицами, т.к. если делать вложенный запрос, и без того громоздкий и тяжелый для чтения запрос станет совсем нечитаемым. К тому же, в результирующей таблице я вывел отдельно день, месяц и год. Нужно будет их еще склеить с нужным разделителем, но это не сложно.
12. SlavaKron 10.02.21 09:06 Сейчас в теме
Какой-то театр абсурда.
И совсем бы не хотелось дополнительно после выгрузки из запроса эту ТЗ обрабатывать.
Поэтому давайте сотворим монстра в запросе, вместо элементарной постобработки.
13. vis_tmp 32 06.02.24 09:16 Сейчас в теме
(12)Постобработка не всегда возможна или разумна.
Например, в отчёте на СКД.
Оставьте свое сообщение

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