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