0. ildarovich 6939 22.01.13 13:19 Сейчас в теме

Выразить строку как число и строку как дату в запросе

Приведены и прокомментированы запросы, помогающие решать указанные задачи в составе пакетных запросов. Отличием от других известных решений является простая структура, относительная компактность, высокие быстродействие и устойчивость к ошибкам исходных данных. Применяется техника искусственных таблиц, изначально упомянутая в статье "Порождающий запрос" [http://infostart.ru/public/90367/].

Перейти к публикации

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Ёпрст 1036 24.01.13 10:47 Сейчас в теме
До чего только 1с-ина не доводит, всего лишь не реализовав простейший cast и convert в текстах запроса.
Сплошное извращение.
vladimirmatancev; oninfostart; TankO_o; KazanKokos; websamson; NN2P; Восьмой; Lem0n; KoldunOne; корум; igo1; madonov; Varsaavius; Nelli_A86; Spacer; PhoenixAOD; EMelihoff; maljaev; sstas007; Serg3141; evillit; Sanario; zqzq; baton_pk; CratosX; AllexSoft; JohnyDeath; logos; yuraos; OVladius; sh4d0w; Hany; _also; andrewks; +34 Ответить
3. Поручик 4374 24.01.13 11:51 Сейчас в теме
(1) Может вам ещё replace и insert с пивом подать?
5. Ёпрст 1036 24.01.13 12:44 Сейчас в теме
(3) а что в этом плохого ?
Всё жлу, мот кто сподобится хотя бы под скуль написать вк для прямой записи в таблички с метапарсером и типизацией, как в клюшках. (вилдфайре не предлагать)
28. yuraos 960 28.03.13 08:44 Сейчас в теме
(1) Ёпрст,
много что не реализовали...
например хотя бы простейшие строковые функции
LTRIM() и RTRIM()
---
не будем грузить разработчиков платформы
функцией ALLTRIM()
которой почему-то в T-SQL у Микрософта нет.
29. andrewks 1273 28.03.13 08:52 Сейчас в теме
(28) yuraos, я думаю, разработчики платформы и так не слишком загрузились ))
AllexSoft; yuraos; +2 Ответить
30. yuraos 960 28.03.13 18:57 Сейчас в теме
(29) andrewks,
ну думаю они даже очень загрузились в последнее время ...
...
только не тем, что нас простых смертых
(и довольно грешных) интересует.

Все в каких-то ОБЛАКАХ ВИТАЮТЬ !!!
:)
Rabot; tindir; +2 Ответить
47. pavlinuh 29.01.15 16:36 Сейчас в теме
(1)(1)(39) В учебниках "Алгебра и начала анализа" конца 80-х - начала 90-х для 10/11 классов этот раздел назывался "комбинаторика". В современных учебных пособиях, в зависимости от издания/автора, он называется "введение в теорию вероятности", "теория вероятности", "логические задачи" и т.п.
Что там в институтах - не в курсе.
2. Поручик 4374 24.01.13 11:46 Сейчас в теме
(0) Почему-то мне нравятся твои работы. Что-то уже применял в рабочих проектах.
4. wunderland 201 24.01.13 12:27 Сейчас в теме
да, некоторых функций SQL иногда не хватает, и за такие вот статьи большой (+)
6. Созинов 25.01.13 11:56 Сейчас в теме
Может вопрос глупый, но все же. Не ткнете носом, что необходимо освежить в памяти из области математики, чтобы лучше понимать такие запросы?
7. andrewks 1273 25.01.13 13:34 Сейчас в теме
(6) EfiopReal, из математики - почти ничего. ну, разве только матрицы и операции над ними
8. Hany 25.01.13 13:39 Сейчас в теме
(6) EfiopReal, дискретная математика, что-то из мат. анализа. Диф. ур. не надо.
Созинов; +1 Ответить
9. andrewks 1273 25.01.13 13:42 Сейчас в теме
(8) Hany, не расскажете поподробнее про мат.анализ?
11. ildarovich 6939 25.01.13 16:04 Сейчас в теме
(6) Основой описанных преобразований является небанальная арифметика (то есть раздел математики, изучающий числа, их отношения и свойства). В школе такую «арифметику» проходят на информатике. Тема называется «системы счисления». В Вузе предмет, включающий эту тему, может называться «Арифметические и логические основы вычислительной техники».
Также хорошо бы уметь работать с матрицами и векторами. Тогда будут более понятны суммы произведений. В школьной программе матриц вроде бы нет (возможно, их изучают в математических классах). В Вузе матрицы встречаются во многих курсах, но раньше всего, наверное, в курсе «Линейная алгебра».
Не пропустите комбинаторику. Научитесь считать варианты. Не знаю, насколько часто этот раздел изучается отдельно, но он наверняка есть в «теории вероятностей», а это самый «практичный» (на мой взгляд) раздел математики. В рамках теории вероятностей можно познакомиться с необходимой частью теории множеств.
От теории множеств недалеко до реляционной алгебры – это основа табличных (реляционных) баз данных. Хотя, возможно, сама теория на каждый день не так уж и нужна.
Ну и еще одна смежная дисциплина – «теория графов». Это очень популярная абстрактная модель, на основе которой можно формулировать и решать многие практические задачи.
user622032_iif1992; Dain; NittenRenegade; AzagTot; mairon; Zabava_; user597574_avarius007; forrain@rambler.ru; xsazar; Dozkni; adva; CratosX; SeiOkami; SirYozha; Созинов; +15 Ответить
19. Созинов 28.01.13 18:22 Сейчас в теме
(11) Спасибо большое, с первой половиной более менее могу разобраться, а вот вторую придется подтянуть.
12. bogdan_sukonnov 57 28.01.13 10:49 Сейчас в теме
в тексте описания примера упоминается строка "4957379257", а в примере разбирается 4957379252
13. ildarovich 6939 28.01.13 10:57 Сейчас в теме
(12) Спасибо! Вы очень внимательны. Поправлю поясняющий рисунок, когда буду обновлять статью.
14. bogdan_sukonnov 57 28.01.13 14:11 Сейчас в теме
тогда заодно поправьте подписи к колонкам в поясняющей таблице - насколько я понял, перепутаны местами А.П и А.С. Это, конечно, мелочи - статья замечательная, спасибо! Никак не могу понять как это работает, а самое главное, научиться самому писать такие запросы :(
Гриффин; ildarovich; +2 Ответить
15. bogdan_sukonnov 57 28.01.13 14:19 Сейчас в теме
интересно, что "1а2а3" преобразует к 10203 - как-то не очень хорошо
16. ildarovich 6939 28.01.13 14:32 Сейчас в теме
(15) Интерпретация ошибочных данных (здесь в запись числа вкрался не цифровой символ) требует до-определения правил преобразования. Их нетрудно внести в запрос, сделав это по примеру запроса №2. Реализованная интерпретация как кажется, имеет право на жизнь. Например, если столбик чисел Вы получили сканированием текста. Не распознанные цифры заменяются "0". В этом есть своя логика. Можно вообще отказываться от преобразования, обнаружив не цифровой символ. Но это уже детали.
17. bogdan_sukonnov 57 28.01.13 14:45 Сейчас в теме
наконец, осилил первый пример! Не стоит ли в целях облегчения понимания сделать отдельную таблицу "Б" с цифрами от 1 до 9? Плюс это поможет тем, кто будет преобразовывать строки длиной <10 (а я пытался переписать запрос на строку 3 символа - без отдельной таблицы "Б" никак). К тому же это, наверное, сократит количество комбинаций "А" и "Б", особенно для длинных строк "А". Ну и совсем было бы по 1С-овски дать осмысленные названия этим таблицам. Я понимаю, что программисты должны знать математику и т.д. Но почему бы не сделать людям понятнее?
18. ildarovich 6939 28.01.13 15:21 Сейчас в теме
(17) Отдельную таблицу заводить не хочется из эстетических соображений. Текст запроса в этом случае неминуемо станет длиннее. Предупредить о том, что таблица позиций и их весов должна иметь минимум ДЕСЯТЬ записей (таблица Б должна быть позволять пробегать и цифру "0"! Это важно), наверное, нужно . Проигрыш по времени из-за использования одной таблицы заключается в проверке ГДЕ, выполняемой ПЕРЕД соединением. Поэтому он НЕЗНАЧИТЕЛЕН. Над осмысленными именами таблиц я подумаю. Они нужны, согласен. С другой стороны, мне в другой публикации в качестве идеального решения приводили текст запроса для Postgre. Там имена таблиц и полей все состояли из одной латинской буквы и выглядело это действительно кратко и ясно. Так что тут одно из двух - либо математически коротко, чтобы запрос можно охватить одним взглядом, либо содержательные названия полей и таблиц.
20. akomar 436 29.01.13 18:07 Сейчас в теме
Но согласитесь запросы красиво смотрятся, пирамиды Хеопса)
21. Crush 30.01.13 11:13 Сейчас в теме
Замечательная статья! Спасибо большое!
Распечатал и добавил в избранное:)
22. It-developer 20 30.01.13 16:41 Сейчас в теме
Жесть. Сложно представить что это можно использовать. Типа сделать процедуру, а в нее передавать строковые числа? Не знаю, это может быть актуально для запроса, но передавать таблицу, а потом ее откуда-то получать не очень удобно
23. ildarovich 6939 30.01.13 18:18 Сейчас в теме
(22) Конечно,
это может быть актуально для запроса
. Вне запроса никаких проблем преобразования, конечно же, нет. Вас, видимо, смутил первый запрос в пакете. Он нужен ИСКЛЮЧИТЕЛЬНО ДЛЯ ТЕСТИРОВАНИЯ этих методов. Считается, что в реальных задачах строки, которые нужно преобразовать в числа или даты, берутся НЕПОСРЕДСТВЕННО из информационной базы. Возможно, нужно было подчеркнуть этот момент в самой статье.
24. ADirks 181 01.02.13 10:37 Сейчас в теме
Возможно, нужно было подчеркнуть этот момент в самой статье.

Если человек хотя бы примерно понимает, как это работает, то наверное поймёт и как использовать :)
25. ilov_boris 158 01.02.13 15:40 Сейчас в теме
Полезные сведения. Спасибо
26. alxbzm 06.02.13 18:23 Сейчас в теме
На Postgre 9 не работает к сожалению. Запрос падает с ошибкой function substr(...) does not exist. Именно на вычислении выражения ПОДТСТРОКА(...). Жаль, но сама идея запроса отличная.
31. a-novoselov 1101 04.06.13 18:27 Сейчас в теме
(26) Возможно у вас Postgre под 1С не патченый? Есть специальные сборки от EterSoft, в которых таких ошибок не возникает. Либо официальный патч от 1С (на официальном сайте выложен), но ни кто не дает гарантии что вы все правильно пропатчите... И патч, обычно, не для самых последних версий Postgre.
27. Andry.Boris 55 22.02.13 02:39 Сейчас в теме
32. Al-X 20.06.13 13:23 Сейчас в теме
Спасибо за статью. Тоже недавно надо было в запросе преобразовывать строки в числа. Теперь буду знать, КАК ПРАВИЛЬНО ДЕЛАТЬ.
33. Synoecium 675 28.08.13 11:11 Сейчас в теме
Качественная подача материала, спасибо.
34. Kesr 11.09.13 11:40 Сейчас в теме
Отличная идея. У меня как раз возникла задача, где придется реализовать 1 вариант.
36. ronhard 20.01.14 16:55 Сейчас в теме
Есть все-таки на свете умные люди.
Это, конечно, мелочи - статья замечательная, спасибо! Никак не могу понять как это работает, а самое главное, научиться самому писать такие запросы :(

Поддерживаю на 100%
37. yura1960 13.06.14 19:12 Сейчас в теме
Хм... С этой стороны я не догадался рассматривать эту проблему. Хотя у меня функции короче и проще, но кое в чем они проигрывают.
Автору спасибо. Попробую поизвращаться. Если реально поможет, то будет огромный СЕНКС!!!
38. Lama12-1 8 09.07.14 13:55 Сейчас в теме
А по какому национальному стандарту происходит преобразование?
39. ildarovich 6939 09.07.14 17:30 Сейчас в теме
(38) Lama12-1, если речь о "национальном стандарте", то, видимо, имеется ввиду преобразование строка -> дата.
Это преобразование задается ФОРМАТНОЙ СТРОКОЙ, которую в примере 6 можно задавать.
В примерах 4 и 5 форматная строка фиксирована. Она имеет вид ГГГГММДД. Например, сегодняшняя дата в этом формате "20140709".
Если вы чуть-чуть разбираетесь в запросах, то сможете составить преобразование под любой формат даты, ну или под тот национальный стандарт, который нужен.
40. chmv 07.08.14 08:37 Сейчас в теме
На самом деле это большая проблема.
До сих пор не могу написать
Выбрать Сотрудник.Наименование+Сотрдуник.ДатаРождения как СотрудникСДатойРождения
Подскажите как это сделать?
41. ildarovich 6939 07.08.14 09:12 Сейчас в теме
(40) chmv, то, что вы хотите, требует преобразования из даты в строку, а в данной статье рассматривается обратное преобразование - из строки в дату. Так, что приемы, описанные в данной статье, напрямую вам не помогут.
42. luic 17.08.14 09:42 Сейчас в теме
Спасибо, очень помогло))
43. evillit 22.10.14 19:56 Сейчас в теме
Полезная статья. В мемориз.
44. chmv 01.12.14 10:40 Сейчас в теме
Спасибо. А попроще нельзя?
45. ildarovich 6939 01.12.14 13:47 Сейчас в теме
(44) chmv, попроще пока не получилось
46. SemenovaMarinaV 27.01.15 14:00 Сейчас в теме
жаль что 1с это не предусмотрела, а то приходится извращаться
48. adva 41 08.06.15 08:58 Сейчас в теме
Иногда для практических целей нужно наоборот получить в запросе вместо числа строку. Имеется ли такое же красивое решение?
49. ildarovich 6939 08.06.15 09:48 Сейчас в теме
50. adva 41 08.06.15 12:38 Сейчас в теме
(49) спасибо, не попадалось ранее, а еще может быть есть статья о том, как пронумеровать в запросе строки (иногда нет номеров строк, а очень хочется, чтобы дальше в запросе использовать, не выгружая в ТЗ)?
51. ildarovich 6939 08.06.15 13:34 Сейчас в теме
(50) adva, это слишком простая задача для статьи. Вот в задаче 14 из статьи Минимализмы для нумерации таблицы дат используется подзапрос
ВЫБРАТЬ 
    Даты.Дата, 
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатыДо.Дата) КАК Номер 
ПОМЕСТИТЬ НомераДат 
ИЗ 
    ВТДаты КАК Даты 
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДаты КАК ДатыДо 
        ПО (ДатыДо.Дата < = Даты.Дата) 
СГРУППИРОВАТЬ ПО 
    Даты.Дата 
Показать

Аналогично может быть пронумерована любая другая таблица, в которой есть поле, определяющее порядок строк для нумерации. Если такого поля (набора полей) нет, то задача в запросе не может быть решена. Это принципиальный момент.
Соединение таблицы с собой довольно затратная по времени операция. В некоторых случаях нумерацию можно ускорить за счет того, что нумерация - это тот же нарастающий итог и его можно ускорить как показано в статье Баттерфляй - метод быстрого расчета нарастающего итога в запросе. Но это имеет смысл, только если строк больше 2000 (для SQL).
52. YuriFm 07.07.17 23:22 Сейчас в теме
статья однозначно крутая. использовал запрос для преобразования таблицу строк в таблицу целых чисел, с небольшим изменением. в числе были пробелы, нужно было от них избавиться. однозначно +
53. German_Tagil 7 13.03.20 14:22 Сейчас в теме
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Специалист внедрения и сопровождения 1С
Москва
зарплата от 80 000 руб.
Полный день

Product Owner (Менеджер по продукту 1С)
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Тим лид по разработке 1С (Team Lead 1С)
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Новосибирск
зарплата от 30 000 руб.
Временный (на проект)