Добрый день.
Помогите, пожалуйста.
Есть запрос по документам - у документа есть дата (формат "Д=mm-dd-YYYY MM:HH:SS)
а мне нужно в результат запроса добавить колонку, которая содержала бы эту же дату, но только в формате "Д = mm-dd-YYYY"
(2) beldieff, ну это уже как спортивный интерес был - переросло в навязчивую идею )
понятно, что можно работать с результатом... но хотелось реализовать как то сразу - одним действием
(1) compreSSor, формат - это характеристика вывода данных. А дата - это тип. В запросе и в его результатах - данные типа "дата", никакого формата у них нет.
в результат запроса добавить колонку, которая содержала бы эту же дату, но только в формате "Д = mm-dd-YYYY"
- эта задача не имеет смысла, потому что в результате запроса дата - это значение типа "дата" и хранится оно в формате, который предусмотрен используемой СУБД.
(1) compreSSor, дата хранится не в текстовом представлении формат "Д=mm-dd-YYYY MM:HH:SS или "Д = mm-dd-YYYY"
дата хранится во внутреннем представлении, и уже при формировании строкового представления происходит форматирование в соответствии с заданным представлением
(6) beldieff, исходя из СП в (4) должно работать.
ДАТАВРЕМЯ ( <Целое число>, <Целое число>,...
Функция ГОД - Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа ЧИСЛО.
(8) compreSSor, И я про тоже. Исходя из СП должно катить... Видимо ДатаВремя жрет исключительно Число, ибо даже так не катит:
Выбрать ДатаВремя(&_П1,&_П2,&_П3) (какая уж речь об разыменование)
а если немного усложнить задачу ? )))
запрос приобрёл вид
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМ.Ссылка КАК Ссылка,
| ЧекККМ.Дата КАК Дата,
| 1 КАК Количество,
| ЧекККМ.СуммаДокумента,
| НАЧАЛОПЕРИОДА(ЧекККМ.Дата, ДЕНЬ) КАК ДатаДокумента
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.Дата МЕЖДУ &Дата1 И &Дата2
| И ЧекККМ.СтатусЧекаККМ = &СтатусЧекаККМ
| И ЧекККМ.Магазин = &Магазин
| И ЧекККМ.ВидОперации = &ВидОперации
|
|УПОРЯДОЧИТЬ ПО
| Дата";
Показать
а как теперь тут же указать, чтобы выбирало чеки только с 22:00:00 по 22:59:59 ?
у меня мозгов хватило на условие
| И Час(ЧекККМ.Дата) = 22
но это катит только если в течении одного часа, а если нужно с 22:00:00 по 23:59:59 - тогда у меня ступор )
(20) compreSSor,
Если в течение 1 часа, то как у вас. Если в течение нескольких часов, то:
ЧекККМ.Дата МЕЖДУ &Дата1 И &Дата2 И Час(ЧекККМ.Дата) >= 22 И Час(ЧекККМ.Дата) <= 23
Еще можно пользоваться конструкцией ДАТАВРЕМЯ(), для формирования произвольной даты в запросе.
(37) Это не нужно делать в запросе. Запросы для получения данных. С форматами, представлением можно "играться" после получения данных. Не могу себе представить такой ситуации, чтобы кроме как в запросе нельзя было сделать произвольный формат представления данных.
(38) Легко! Вот моя ситуация. Выгрузка состояния складов на каждый день (начальный остаток, приход, расход, конечный остаток) в CISLINK (может сталкивались?). Период - 45 дней. При том нужно выгружать строку даже на ту дату, когда не было движения номенклатуры.
По их требованиям "Формат даты строгий: ГГГГММДД, где ГГГГ – год, ММ – месяц, ДД – день". Таблица на выходе запроса - ну миллиона 3 строк. А теперь давайте, коллега, в цикле будем менять дату на каждую строку, после того как запросом получим конечную таблицу!
На самом деле проще для каждой даты, а их всего 45, заранее получить нужное представление даты, а потом подставить в конечную выборку. Тем более ildarovich давно уже все придумал в https://infostart.ru/1c/articles/331805/ еще в 2017 году!
И там его за это уже критиковали типа "игры ума, зачем это надо".
вот решение, кому пригодиться:
ВЫБРАТЬ
0 КАК Ч
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, ВТ0.Ч + ВТ1.Ч * 10 + ВТ2.Ч * 100 + ВТ3.Ч * 1000) КАК День
ПОМЕСТИТЬ ВТ_СписокДат
ИЗ
ВТ КАК ВТ0,
ВТ КАК ВТ1,
ВТ КАК ВТ2,
ВТ КАК ВТ3
ГДЕ
ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, ВТ0.Ч + ВТ1.Ч * 10 + ВТ2.Ч * 100 + ВТ3.Ч * 1000) <= НАЧАЛОПЕРИОДА(&КонецПериода, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_СписокДат.День КАК День,
ПОДСТРОКА("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) + ПОДСТРОКА("0123456789", МЕСЯЦ(ВТ_СписокДат.День) / 10 + 1, 1) + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * МЕСЯЦ(ВТ_СписокДат.День))) / 6 + 1, 1) + ПОДСТРОКА("0123456789", ДЕНЬ(ВТ_СписокДат.День) / 10 + 1, 1) + ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(ВТ_СписокДат.День))) / 6 + 1, 1) КАК ДатаСтрокой
ИЗ
ВТ_СписокДат КАК ВТ_СписокДат
(35) Чувствуем! но интересно ЖЕ !!!
(я так себе на заметку взял этот способ, мало ли где может пригодиться получить дату в таком формате "2023-06-27" )
(36) Реальный случай опишите, пожалуйста, где вот никак пост-обработка на встроенном языке невозможна?
Пока что вся тема выглядит как секта свидетелей ДЕЛАТЬ ВСЁ В ЗАПРОСЕ, потому что "меня так учили".
upd: Сейчас заметил, что ответил на старый комментарий: не обратил внимание, что это некропост. В целом, ну я бы не стал поддерживать такой код, доставшийся "по наследству", а переписал бы заново.
43.
vitaliy.makushev@gmail.com
14.01.24 16:52 Сейчас в теме
Столкнулся с задачей, когда в запросе надо было сделать описание, в которое включить дату в формате "DD.mm.YYYY" У меня получилось так, может кому пригодится:
... + " от " + ВЫБОР
КОГДА ДЕНЬ(ТаблицаИнтересов.Дата) < 10
ТОГДА "0"
ИНАЧЕ ""
КОНЕЦ + СТРОКА(ДЕНЬ(ТаблицаИнтересов.Дата)) + "." + ВЫБОР
КОГДА МЕСЯЦ(ТаблицаИнтересов.Дата) < 10
ТОГДА "0"
ИНАЧЕ ""
КОНЕЦ + СТРОКА(МЕСЯЦ(ТаблицаИнтересов.Дата)) + "." + СТРЗАМЕНИТЬ(СТРОКА(ГОД(ТаблицаИнтересов.Дата)), " ", "") + ...
Показать
В годе идёт замена неразрывного пробела, чтобы год не выглядел как "2 024"
(44) Неразрывный пробел код имеет не 20h (32 десятичное), а десятичное 160 (если не перепутал :-) ).
С клавиатуры вводится как Alt+160. Визуально от пробела не отличается, так как это тоже пробел.
Неразрывный, так как слово не прерывает и авто перенос в текстовых редакторах его воспринимает как обычную букву, а не пробел.