Уже многократно поднимался похожий вопрос на форуме, но мне трудно поверить, что это невозможно.
У меня есть ТЗ, выгруженная из запроса, которая сразу преобразуется в csv общими функциями, как колонки вывела в запросе - то и получила в результате. И совсем бы не хотелось дополнительно после выгрузки из запроса эту ТЗ обрабатывать.
Мне всего лишь нужна дата без времени.
У меня есть временная таблица и выборка из неё. Наглядно что я пытаюсь сделать. Я хочу получить дату без времени без громоздких конструкций. Пробовала отдельно Год, День, Месяц, но эти числа не превратить в строку
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(РеестрОтгрузки.Дата) ДатаРеестра
Поместить ЗаказыЗаПериод
.....
;
ВЫБРАТЬ
Подстрока(ДатаРеестра,1,10) КАК ДокументДата
ИЗ ЗаказыЗаПериод
В общем, ГОРАЗДО проще, но, возможно, медленнее, будет обрабатывать результат запроса программно. Там можно будет дату в строку перевести, по точкам разложить и т.п. Но раз уж хочется в запросе, то вот запрос.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) КАК Дата,
ГОД(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)) КАК Год
ПОМЕСТИТЬ ВТДата
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДата.Дата КАК Дата,
ВЫБОР
КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 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. Сделал с временными таблицами, т.к. если делать вложенный запрос, и без того громоздкий и тяжелый для чтения запрос станет совсем нечитаемым. К тому же, в результирующей таблице я вывел отдельно день, месяц и год. Нужно будет их еще склеить с нужным разделителем, но это не сложно.
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЕСТЬNULL(НАЧАЛОПЕРИОДА(ЗаказКлиента.Дата, ДЕНЬ), "") КАК Дата
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
Не даст, у него просто 00:00:00 в чч:мм:сс, которые присутствуют в результате выборки. Не знаю, почему у Вас результат отобразил без времени, какое-то отображение 1С видимо. У меня 05.01.2021 00:00:00
Сложить с нужными разделителями. Написала отдельно, потому что есть вопросы в +1 и +0,5. При +1 в дне у меня получался неправильный день. Я не до конца поняла этот алгоритм.
В общем, ГОРАЗДО проще, но, возможно, медленнее, будет обрабатывать результат запроса программно. Там можно будет дату в строку перевести, по точкам разложить и т.п. Но раз уж хочется в запросе, то вот запрос.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) КАК Дата,
ГОД(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)) КАК Год
ПОМЕСТИТЬ ВТДата
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДата.Дата КАК Дата,
ВЫБОР
КОГДА (ВЫРАЗИТЬ(ВТДата.Год / 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. Сделал с временными таблицами, т.к. если делать вложенный запрос, и без того громоздкий и тяжелый для чтения запрос станет совсем нечитаемым. К тому же, в результирующей таблице я вывел отдельно день, месяц и год. Нужно будет их еще склеить с нужным разделителем, но это не сложно.