|
выразить строку как дату в запросе | ☑ | ||
---|---|---|---|---|
0
ботаникус
24.11.11
✎
12:42
|
в запросе есть поле строка вида 20110401 . Как можно выразить это в дату?
|
|||
1
Ненавижу 1С
гуру
24.11.11
✎
12:45
|
только извращаясь с выбор
|
|||
2
DrShad
24.11.11
✎
12:45
|
НачалоПериода()
КонецПериода() справку украли? |
|||
3
Wobland
24.11.11
✎
12:46
|
мне вот интересно, как такая строка туда попала
|
|||
4
DrShad
24.11.11
✎
12:48
|
(3) неправильная архитектура регистров, справочников или еще чего нибудь
|
|||
5
ботаникус
24.11.11
✎
12:49
|
(3) делаю запрос к 1с7 через внешний источник данных
|
|||
6
ботаникус
24.11.11
✎
12:49
|
(2) и как здесь это поможет?
|
|||
7
ботаникус
24.11.11
✎
12:51
|
(1) хм... чета ваще не догоняю, можете намекнуть?
|
|||
8
DrShad
24.11.11
✎
12:51
|
(6) за тебя все написать?
|
|||
9
PR
24.11.11
✎
12:52
|
(0) Никак
|
|||
10
DrShad
24.11.11
✎
12:53
|
(9) весьма спорно
|
|||
11
PR
24.11.11
✎
12:53
|
+(9) Кроме сумасшедшего (1) есно :))
|
|||
12
DrShad
24.11.11
✎
12:54
|
(11) а через (2)?
|
|||
13
PR
24.11.11
✎
12:55
|
(10) Что спорно?
Что из строки в запросе не получишь дату? Если бы из строки можно было бы получить число, то помогло бы ПОДСТРОКА и ДАТАВРЕМЯ, но строку в число тоже не преобразуешь. Так что только через офигительный ВЫБОР. |
|||
14
PR
24.11.11
✎
12:55
|
(12) Это функции, работающие с датой, а не строкой.
|
|||
15
Ненавижу 1С
гуру
24.11.11
✎
12:57
|
вот это начало года:
ДОБАВИТЬКДАТЕ( ВЫБОР КОГДА ПОДСТРОКА(Стр,1,2)="19" ТОГДА ДАТАВРЕМЯ(1900,1,1) КОГДА ПОДСТРОКА(Стр,1,2)="20" ТОГДА ДАТАВРЕМЯ(2000,1,1) КОНЕЦ, ВЫБОР КОГДА ПОДСТРОКА(Стр,3,1)="0" ТОГДА 0 КОГДА ПОДСТРОКА(Стр,3,1)="1" ТОГДА 1 ... КОГДА ПОДСТРОКА(Стр,3,1)="9" ТОГДА 9 КОНЕЦ*10+ ВЫБОР КОГДА ПОДСТРОКА(Стр,4,1)="0" ТОГДА 0 КОГДА ПОДСТРОКА(Стр,4,1)="1" ТОГДА 1 ... КОГДА ПОДСТРОКА(Стр,4,1)="9" ТОГДА 9 КОНЕЦ, ГОД) далее начало месяца, ну и день |
|||
16
ботаникус
24.11.11
✎
12:57
|
(8) не надо злиться. просто не понимаю, как НачаоПериода() может помочь. Туда же надо дату передать, а даты то и нет
|
|||
17
hhhh
24.11.11
✎
12:58
|
(16) ну ты выбирай дату их семерки. Нафига строку-то передаешь?
|
|||
18
PR
24.11.11
✎
12:59
|
(17) Черт, спалил всю интригу :))
|
|||
19
ботаникус
24.11.11
✎
13:02
|
(17) там дата в 1сжорн в формате Date+Time+IDDoc . как вы предлагаете выбрать дату?
|
|||
20
PR
24.11.11
✎
13:03
|
(19) В стандартном 1С запросе Date+Time+IDDoc? o_O
|
|||
21
ботаникус
24.11.11
✎
13:05
|
(19) что значит "В стандартном 1С запросе"? выше написано, что запрос из внешнего источника данных
|
|||
22
PR
24.11.11
✎
13:06
|
(21) А в запросе из внешнего источника данных нельзя из Date+Time склепать дату?
|
|||
23
ботаникус
24.11.11
✎
13:07
|
(15) спасибо! слишком сложно, но по другому похоже никак
|
|||
24
ботаникус
24.11.11
✎
13:11
|
(21) может я чего-то не понимаю, но подскажите если не сложно
там строка типа 2011040118f5g0 5www. Как получить дату? |
|||
25
PR
24.11.11
✎
13:13
|
(24) Эээ..., ну 20110401 очевидно дата, а вот насчет того, что 18f5g0 - время, не уверен.
|
|||
26
ботаникус
24.11.11
✎
13:14
|
(25)да, 20110401 я получаю чере подстроку, а дальше нужно это в дату преобразовать
|
|||
27
ботаникус
24.11.11
✎
13:14
|
что и написано в названии темы
|
|||
28
PR
24.11.11
✎
13:17
|
(26) А, запрос из внешнего источника данных же вроде как нигде явно не оперирует низкоуровневым запросом, а значит можно оперировать только текстом запроса 1С.
А что мешает преобразовать это в дату позже? Или это отчет, который просто выводится без обработки? |
|||
29
ботаникус
24.11.11
✎
13:19
|
"а значит можно оперировать только текстом запроса 1С. " да, скульный конверт вставить не получится
Позже конечно можно, но для моей задачи это неприемлемо |
|||
30
PR
24.11.11
✎
13:20
|
(29) Что за задача-то? Утюг нести?
|
|||
31
ботаникус
24.11.11
✎
13:22
|
кстати, куда пропал докторШАД, ушел "читать справку" (с)? Нагрубил и съ..бался, короче типичный 1сник
|
|||
32
Snorkler
24.11.11
✎
13:22
|
(27) На запросе все заканчивается? Не проще потом уже результат запроса преобразовать?
|
|||
33
Snorkler
24.11.11
✎
13:23
|
(30) :0)
|
|||
34
ботаникус
24.11.11
✎
13:26
|
(29) преобразовать в дату после выполнения запроса проще простого, но ведь ты и сам понимаешь, что это не лучшее решение... да топик совсем не об этом
|
|||
35
МихаилМ
24.11.11
✎
13:27
|
(0)
ну напишите ф-цию на TSQL конечно все написано до Вас. Но быстрее написать, чем искать в интернет |
|||
36
Snorkler
24.11.11
✎
13:29
|
(34) А мне всегда интуитивно казалось, что "проще простого" - это обычно и есть "лучшее решение"… :0)
|
|||
37
МихаилМ
24.11.11
✎
13:35
|
(36)
в этом основная беда русских (ну и русско говорящих) упрощение - как метод отимизации что чаще всего ошибка. |
|||
38
Snorkler
24.11.11
✎
13:53
|
(37) Отимизация - это когда отымели? :0)
Тогда правильнее отымизация. Не думаю, что это ЧАЩЕ всего ошибка. Можете поспорить об этом с Михаилом Калашниковым и "бритвой Оккама"… :0) |
|||
39
DrShad
24.11.11
✎
13:56
|
(13) да согласен
|
|||
40
ботаникус
24.11.11
✎
14:06
|
(39) молодец, что хоть признал свою ошибку
|
|||
41
Inform
24.11.11
✎
14:11
|
(0), лови:
ВЫБРАТЬ "20110401" КАК Дата ПОМЕСТИТЬ ВТ_Даты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 0 КАК Цифра, "0" КАК ЦифраСтрокой ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 1, "1" ОБЪЕДИНИТЬ ВЫБРАТЬ 2, "2" ОБЪЕДИНИТЬ ВЫБРАТЬ 3, "3" ОБЪЕДИНИТЬ ВЫБРАТЬ 4, "4" ОБЪЕДИНИТЬ ВЫБРАТЬ 5, "5" ОБЪЕДИНИТЬ ВЫБРАТЬ 6, "6" ОБЪЕДИНИТЬ ВЫБРАТЬ 7, "7" ОБЪЕДИНИТЬ ВЫБРАТЬ 8, "8" ОБЪЕДИНИТЬ ВЫБРАТЬ 9, "9" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 1, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ПерваяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 2, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ВтораяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 3, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ТретьяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 4, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ЧетвертаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 5, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ПятаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 6, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ШестаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 7, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК СедьмаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 8, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ВосьмаяЦифра ПОМЕСТИТЬ ВТ_ЦифрыИзДат ИЗ ВТ_Даты КАК ВТ_Даты ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры ПО (ПОДСТРОКА(ВТ_Даты.Дата, 1, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 2, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 3, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 4, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 5, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 6, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 7, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 8, 1) = ВТ_Цифры.ЦифраСтрокой) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ЦифрыИзДат.ПерваяЦифра * 1000 + ВТ_ЦифрыИзДат.ВтораяЦифра * 100 + ВТ_ЦифрыИзДат.ТретьяЦифра * 10 + ВТ_ЦифрыИзДат.ЧетвертаяЦифра КАК ГодЧислом, ВТ_ЦифрыИзДат.ПятаяЦифра * 10 + ВТ_ЦифрыИзДат.ШестаяЦифра КАК МесяцЧислом, ВТ_ЦифрыИзДат.СедьмаяЦифра * 10 + ВТ_ЦифрыИзДат.ВосьмаяЦифра КАК ДеньЧислом ПОМЕСТИТЬ ВТ_ГодМесяцДеньЧислом ИЗ ВТ_ЦифрыИзДат КАК ВТ_ЦифрыИзДат ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), ГОД, ВТ_ГодМесяцДеньЧислом.ГодЧислом - 1), МЕСЯЦ, ВТ_ГодМесяцДеньЧислом.МесяцЧислом - 1), ДЕНЬ, ВТ_ГодМесяцДеньЧислом.ДеньЧислом - 1) КАК Поле1 ИЗ ВТ_ГодМесяцДеньЧислом КАК ВТ_ГодМесяцДеньЧислом P.S.: я не тестировал особо эту штуку, так что проверь получше. По временным таблицам удобно разнесено, должно быть понятно что где исправить в случае чего... |
|||
42
ботаникус
24.11.11
✎
14:15
|
(41) спасибо, гляну
|
|||
43
ботаникус
24.11.11
✎
14:18
|
тут еще шальная мысль в голову пришла
создаем тз с 2 колонками: Дата и ДатаСтрокой Забиваем ее датами за 3 года (мне больше не надо) Запихиваем во временную таблицу Соединяемся со временной таблицей и получаем нормальную дату |
|||
44
Inform
24.11.11
✎
14:30
|
+ (41) вот так правильнее:
ВЫБРАТЬ "20110401" КАК Дата ПОМЕСТИТЬ ВТ_Даты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "20090807" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "20090909" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 0 КАК Цифра, "0" КАК ЦифраСтрокой ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 1, "1" ОБЪЕДИНИТЬ ВЫБРАТЬ 2, "2" ОБЪЕДИНИТЬ ВЫБРАТЬ 3, "3" ОБЪЕДИНИТЬ ВЫБРАТЬ 4, "4" ОБЪЕДИНИТЬ ВЫБРАТЬ 5, "5" ОБЪЕДИНИТЬ ВЫБРАТЬ 6, "6" ОБЪЕДИНИТЬ ВЫБРАТЬ 7, "7" ОБЪЕДИНИТЬ ВЫБРАТЬ 8, "8" ОБЪЕДИНИТЬ ВЫБРАТЬ 9, "9" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 1, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ПерваяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 2, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ВтораяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 3, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ТретьяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 4, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ЧетвертаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 5, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ПятаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 6, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ШестаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 7, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК СедьмаяЦифра, МАКСИМУМ(ВЫБОР КОГДА ПОДСТРОКА(ВТ_Даты.Дата, 8, 1) = ВТ_Цифры.ЦифраСтрокой ТОГДА ВТ_Цифры.Цифра ИНАЧЕ 0 КОНЕЦ) КАК ВосьмаяЦифра, ВТ_Даты.Дата ПОМЕСТИТЬ ВТ_ЦифрыИзДат ИЗ ВТ_Даты КАК ВТ_Даты ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры ПО (ПОДСТРОКА(ВТ_Даты.Дата, 1, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 2, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 3, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 4, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 5, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 6, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 7, 1) = ВТ_Цифры.ЦифраСтрокой ИЛИ ПОДСТРОКА(ВТ_Даты.Дата, 8, 1) = ВТ_Цифры.ЦифраСтрокой) ГДЕ (НЕ ВТ_Даты.Дата ЕСТЬ NULL ) СГРУППИРОВАТЬ ПО ВТ_Даты.Дата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ЦифрыИзДат.ПерваяЦифра * 1000 + ВТ_ЦифрыИзДат.ВтораяЦифра * 100 + ВТ_ЦифрыИзДат.ТретьяЦифра * 10 + ВТ_ЦифрыИзДат.ЧетвертаяЦифра КАК ГодЧислом, ВТ_ЦифрыИзДат.ПятаяЦифра * 10 + ВТ_ЦифрыИзДат.ШестаяЦифра КАК МесяцЧислом, ВТ_ЦифрыИзДат.СедьмаяЦифра * 10 + ВТ_ЦифрыИзДат.ВосьмаяЦифра КАК ДеньЧислом, ВТ_ЦифрыИзДат.Дата ПОМЕСТИТЬ ВТ_ГодМесяцДеньЧислом ИЗ ВТ_ЦифрыИзДат КАК ВТ_ЦифрыИзДат ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), ГОД, ВТ_ГодМесяцДеньЧислом.ГодЧислом - 1), МЕСЯЦ, ВТ_ГодМесяцДеньЧислом.МесяцЧислом - 1), ДЕНЬ, ВТ_ГодМесяцДеньЧислом.ДеньЧислом - 1) КАК Поле1, ВТ_ГодМесяцДеньЧислом.Дата ИЗ ВТ_ГодМесяцДеньЧислом КАК ВТ_ГодМесяцДеньЧислом |
|||
45
Nutsiiam
24.11.11
✎
14:34
|
(0) ох, мать. Вчера тебя колбасило на 1спп, сегодня с датами воюешь.
Самый правильный ответ, да простят меня коллеги, в (35). Функция элементарна настолько, насколько возможно - если ты отроешь любой мануал по T-SQL. На выходе получишь дату в виде строки. Дальше, дергаешь свой чистый запрос, получаешь резалт. Если в 1С нужно преобразование, то через конструктор создания даты получишь свою дату. |
|||
46
Error pro
24.11.11
✎
14:38
|
(0) вот может пригодится переносил доки из 7.7 в 8.2
Функция Дата77(Стр) Если Стр = ". ." или ПустаяСтрока(Стр) Тогда возврат '00010101'; Иначе попытка Год = прав(Стр,2); Мес = Сред(Стр,4,2); День = Лев(Стр,2); Если Число(Год) > 40 Тогда Год = "19" + Год Иначе Год = "20" + Год; КонецЕсли; возврат Дата(Год + Мес + День); исключение возврат '00010101'; КонецПопытки; Конецесли; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |