Работаем с датами в запросе

0. 6498 31.03.10 05:30 Сейчас в теме
Понадобилось в запросе выполнить некоторые операции с датами:
- посчитать дату оплаты в банковских днях;
- собирать строки, в которые должны были входить даты, точнее строковые представления дат в формате "ДФ=dd.MM.yyyy".
Вот что из этого получилось.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. MoneG2 27 31.03.10 05:30 Сейчас в теме
Решение интересное, но есть более простое ;)
http://www.forum.mista.ru/topic.php?id=388253 (23 пост)
Hany; Serjik78; +2 Ответить
2. a-novoselov 1125 31.03.10 07:34 Сейчас в теме
(0) Да уж, чего-то перемудрил с преобразованием. Намного проще 'цифры строкой' в параметре запросу передать и не мучаться, раз уж "1С Язык запросов, чем-то похожий на SQL" не умеет типы преобразовывать.
3. alexk-is 6498 31.03.10 08:34 Сейчас в теме
4. a-novoselov 1125 31.03.10 10:27 Сейчас в теме
(3) Да так тоже очень изящно, молоток. Просто, как ты сам же любишь говорить, не взрывай мозг, делай проще.
5. RailMen 20.06.10 21:57 Сейчас в теме
не дай бог такое увидеть в чей-то базе
7. Поручик 4485 21.06.10 20:58 Сейчас в теме
(5) Это ещё не самое худшее, что можно увидеть в чьей-то базе.
Не дай бог увидеть в чьей-то базе то, что есть в других некоторых базах, вот где жесть.
6. RailMen 20.06.10 21:58 Сейчас в теме
а само решение интересное
8. AlexO 130 16.07.10 15:53 Сейчас в теме
А что за задачи такие - выбрать даты? Откуда, что за даты?
9. CheBurator 3443 01.09.10 01:15 Сейчас в теме
Что есть "банковский день"?
11. CheBurator 3443 01.09.10 05:30 Сейчас в теме
(10) если говорить прямо: лабуда. что значит "обычно банковский день продолжается с 10 до 16 часов.", а необычно? каким законодательным актом устанавливается банковский день?
12. alexk-is 6498 01.09.10 06:07 Сейчас в теме
(11) Наверное, ни какого законодательного акта нет. Это скорее экономический термин чем законодательный. Но его некоторые используют при заключении договоров, оговаривая короткие сроки оплаты.
13. shea 05.10.11 11:18 Сейчас в теме
как соединить 2 таблицы в запросе, при этом у таблиц нет общих реквизитов? можно добавить нуда колонку, например 1, 2 3.... и в другую также, потом по этим соединить?
14. alexk-is 6498 05.10.11 11:23 Сейчас в теме
(13) Какой должен быть результат?
15. SergeyGladyshev 21.12.11 14:03 Сейчас в теме
Долго искал, как вывести даты из определенного диапазона, а тут нашел! Автору статьи респект!
16. sa1m0nn 22 30.12.11 09:35 Сейчас в теме
Прикольно, оригинально, улыбнуло. В свое время тоже башку ломал, как собрать период внутри запроса, не прибегая к собирательству циклов встроенного языка.

Но считаю самым оптимальным в плане производительности и разработки вот такой:

ВЫБРАТЬ ДатаКалендаря ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь ГДЕ ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания

Минус - только один, производственный календарь должен присутствовать в конфигурации, и должен быть заполнен.
17. AndrewEv 18 06.01.12 17:59 Сейчас в теме
18. dem_mad 11.01.12 20:02 Сейчас в теме
Спасибо! Решение интересное.
19. velichutin 10 20.01.12 13:52 Сейчас в теме
Как пример использования дат в запросе хороший. В своей повседневной работе стал использовать. Нету структурированности в данной статье, а так все здорово!! Спасибо.
21. iotkin 29.02.12 10:51 Сейчас в теме
Спасибо! С удовольствием плюсую!!!
22. bolush 12.03.12 14:57 Сейчас в теме
23. N_aix 22.03.12 09:43 Сейчас в теме
Решение интересное особенно в том плане, что месяц можно выводить как вздумется, цифрой, строкой...
24. sumixam 05.05.12 14:11 Сейчас в теме
Сейчас нашел наконец то что и нужно мне
25. k1us181b 30.08.12 02:33 Сейчас в теме
ГДЕ Десятки.Цифра * 10 <<?>> РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
непонятно немного :(
alexk-is; +1 Ответить
26. alexk-is 6498 30.08.12 06:55 Сейчас в теме
(25) Вернул пропавшие знаки на их место
27. aspirator23 451 23.12.12 10:24 Сейчас в теме
А как соединить в запросе строковое поле и поле даты?
Что-то такое:
ТекстЗапроса=
.....
Документ.Номер+" от "+Документ.Дата
....

Через Выразить, подстрока.. не получается
28. alexk-is 6498 23.12.12 14:33 Сейчас в теме
(27) Нужно дату преобразовать к строке и тогда соединить.
Конечно, это проще сделать после выполнения запроса.
29. aspirator23 451 23.12.12 20:52 Сейчас в теме
(28) Нагуглил решение как в запросе дату к строке преобразовать. В первом посте именно на него ссылаются.
30. profych1 23.12.12 22:45 Сейчас в теме
Как пример использования дат в запросе хороший. В своей повседневной работе стал использовать. Нету структурированности в данной статье, а так все здорово!! Спасибо.
31. Magister 134 15.03.13 13:30 Сейчас в теме
Расчет даты оплаты в банковских дней - работает неправильно.
Передаю дату: 14.03.2013 00:00:00 (четверг)
Банковских дней - 1.
Получаю: 17.03.2013 00:00:00 (воскресенье!)

Передаю банковских дней - 6.
Получаю: 24.03.2013 00:00:00 (опять воскресенье!)
alexk-is; +1 Ответить
32. alexk-is 6498 15.03.13 13:54 Сейчас в теме
(31) Magister, после очередного обновления потерялись все знаки сравнения...
Magister; +1 Ответить
33. Magister 134 15.03.13 14:14 Сейчас в теме
(32) Спасибо за оперативность, вижу уже исправлено :)
Правда я и сам успел уже дойти до исправления.
34. Al-X 05.02.14 10:57 Сейчас в теме
Спасибо ! Мне Пригодится ))))
35. PLAstic 270 23.05.14 14:12 Сейчас в теме
Вчера прочитал эту статью, сегодня понадобилось сделать то же самое (просто календарик). Не понравился пример, за пару минут наваял свой текст запроса. Получилось красивее, имхо. Увеличение диапазона на порядок требует добавления лишь одной строки в текст запроса.
ВЫБРАТЬ
	0 КАК Единица
ПОМЕСТИТЬ ВТЕдиницы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Сотни.Единица * 100 + Десятки.Единица * 10 + Единицы.Единица КАК Дней
ПОМЕСТИТЬ ВТДоТысячи
ИЗ
	ВТЕдиницы КАК Единицы,
	ВТЕдиницы КАК Десятки,
	ВТЕдиницы КАК Сотни
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(&ДатаНач, ДЕНЬ, ВТДоТысячи.Дней) КАК Период
ИЗ
	ВТДоТысячи КАК ВТДоТысячи
ГДЕ
	ДОБАВИТЬКДАТЕ(&ДатаНач, ДЕНЬ, ВТДоТысячи.Дней) <= &ДатаКон
Показать
user1026541; BigB; +2 Ответить
36. venger 2097 02.10.14 14:46 Сейчас в теме
(0) По запросу "Список дат календаря в диапазоне до 2739 лет", например, берем НачалоПериода=01.10.2014, КонецПериода=31.10.2014, получем список дат с 1-го по 30-е, 31-е выпадает. Потом, если взять НачалоПериода=31.10.2014, КонецПериода=30.11.2014, то получим список дат с 31.10 по 29.11, т.е. опять же конец периода выпадает. Если взять НачалоПериода=28.02.2014, КонецПериода=30.03.2014, опять же список дат с 28.02 по 29.03, т.е. опять же конец периода выпадает из списка. Последний день в других случаях, скажем НачалоПериода=01.02.2014, КонецПериода=03.02.2014, выдаст правильно, т.е. список из трех дат (1-е, 2-е и 3-е).

Для себя выкрутился пока так, объединяю получившийся список с началом и концом периода, на всякий случай, в подчиненном запросе, а потом уже выбираю оттуда список дат, ну и чтобы со временем даты не играться - везде параметры (начала и конца периода) во всем запросе привожу к началу дня, чтобы не задваивалось в таком варианте и результат тоже к началу дня привожу, уже на всякий случай, хотя и так все дни будут на начало дня, т.е. так:

// Единицы для календаря
ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ Единицы
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9;
////////////////////////////////////////////////////////////­////////////////////
// Десятки для календаря. Диапазон дат 3 месяца
ВЫБРАТЬ Десятки.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Десятки ИЗ Единицы КАК Десятки
ГДЕ Десятки.Цифра * 10 < РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ);
////////////////////////////////////////////////////////////­////////////////////
// Сотни для календаря. Диапазон дат 2,5 года
ВЫБРАТЬ Сотни.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Сотни ИЗ Десятки КАК Сотни
ГДЕ Сотни.Цифра * 10 < РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ);
////////////////////////////////////////////////////////////­////////////////////
// Тысячи для календаря. Диапазон дат 27 лет
ВЫБРАТЬ Тысячи.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Тысячи ИЗ Сотни КАК Тысячи
ГДЕ Тысячи.Цифра * 10 < РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ);
////////////////////////////////////////////////////////////­////////////////////
// Десятки тысяч для календаря. Диапазон дат 273 года
ВЫБРАТЬ ДесяткиТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ ДесяткиТысяч ИЗ Тысячи КАК ДесяткиТысяч
ГДЕ ДесяткиТысяч.Цифра * 10 < РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ);
////////////////////////////////////////////////////////////­////////////////////
// Сотни тысяч для календаря. Диапазон дат 2739 лет
ВЫБРАТЬ СотниТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ СотниТысяч ИЗ ДесяткиТысяч КАК СотниТысяч
ГДЕ СотниТысяч.Цифра * 10 < РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ);
////////////////////////////////////////////////////////////­////////////////////
// Полный ряд до 100
ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК Цифра
ПОМЕСТИТЬ ДоСотни ИЗ Десятки КАК Десятки, Единицы КАК Единицы;
////////////////////////////////////////////////////////////­////////////////////
// Старшие до 10000
ВЫБРАТЬ Тысячи.Цифра + Сотни.Цифра КАК Цифра
ПОМЕСТИТЬ ДоДесятиТысяч ИЗ Тысячи КАК Тысячи, Сотни КАК Сотни;
////////////////////////////////////////////////////////////­////////////////////
// Полный ряд до 10000
ВЫБРАТЬ ДоДесятиТысяч.Цифра + ДоСотни.Цифра КАК Цифра
ПОМЕСТИТЬ ПолныеДесятьТысяч ИЗ ДоДесятиТысяч КАК ДоДесятиТысяч, ДоСотни КАК ДоСотни;
////////////////////////////////////////////////////////////­////////////////////
// Старшие до 1000000
ВЫБРАТЬ СотниТысяч.Цифра + ДесяткиТысяч.Цифра КАК Цифра
ПОМЕСТИТЬ ДоМиллиона ИЗ СотниТысяч КАК СотниТысяч, ДесяткиТысяч КАК ДесяткиТысяч;
////////////////////////////////////////////////////////////­////////////////////
// Список дат календаря в диапазоне до 2739 лет
ВЫБРАТЬ 
	НАЧАЛОПЕРИОДА(ПодчиненныйЗапросДни.ДатаПериода,ДЕНЬ) КАК ДатаПериода
ИЗ	
(ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), ДЕНЬ, ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра) КАК ДатаПериода
ИЗ ДоМиллиона КАК ДоМиллиона, ПолныеДесятьТысяч КАК ПолныеДесятьТысяч
ГДЕ ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра <= РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода,ДЕНЬ), НАЧАЛОПЕРИОДА(&КонецПериода,ДЕНЬ), ДЕНЬ)
ОБЪЕДИНИТЬ 
ВЫБРАТЬ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ) КАК ДатаПериода
ОБЪЕДИНИТЬ
ВЫБРАТЬ НАЧАЛОПЕРИОДА(&КонецПериода, ДЕНЬ) ДатаПериода) КАК ПодчиненныйЗапросДни
УПОРЯДОЧИТЬ ПО ДатаПериода;
Показать


Возможно есть еще какие другие варианты или соображения, или еще какие-то "подводные" камни?
37. venger 2097 02.10.14 14:50 Сейчас в теме
Ну, или получше решение можно предложить?
38. alexk-is 6498 02.10.14 18:02 Сейчас в теме
(37) venger, предлагаю взять исправленный вариант из статьи :)

Уже терялись знаки сравнения. Видимо не все правильно восстановил. Поправил.
39. venger 2097 02.10.14 20:12 Сейчас в теме
(38) Спасибо:-))) Шикарно! И все даты в списке в начале периода, в независимости от того, какое время у входящих параметров.
Оставьте свое сообщение
Вопросы с вознаграждением