Список дат произвольного месяца в запросе

18.10.12

Разработка - Запросы

Для разворачивания остатков/приходов/расходов на каждую дату месяца, в запросе, требуется как минимум список дат месяца по которому будут развернуты данные

Для разворачивания остатков/приходов/расходов на каждую дату месяца в запросе требуется как минимум список дат месяца. Порывшись в интернете я нашел советы использовать для этого: а) РегистрСведений.КурсыВалют (не айс решение) б)РегистрСведений.РегламентированныйПроизводственный1Календарь (уже лучше, если он у Вас есть в конфигурации) в)заполнить список в цикле и подтянуть его в запрос (тривиально довольно) Мое решение самому создать список дат в запросе: 

ВЫБРАТЬ
таб.Даты
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ) КАК Даты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 1)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 2)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 3)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 4)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 5)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 6)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 7)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 8)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 9)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 10)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 11)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 12)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 13)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 14)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 15)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 16)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 17)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 18)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 19)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 20)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 21)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 22)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 23)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 24)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 25)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 26)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 27)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30)
КОНЕЦ) КАК таб
ГДЕ
таб.Даты <> ДАТАВРЕМЯ(1, 1, 1)

Можно было бы и по короче (выкинув средину), но большинству будет удобней просто скопировать в КонсольЗапросов код запроса. От сюда не далеко до списка за интервал дат месяца, за несколько месяцев. Предлагаю обсудить возможность более компактного построения запроса и другие способы получения списка дат в запросе. 

Яремчук Константин

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184760    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2203    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5735    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13145    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8221    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10805    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Serj1C 484 18.10.12 14:40 Сейчас в теме
Запрос в (0) совсем длинный...
надо как-то так
ВЫБРАТЬ	0 КАК А ПОМЕСТИТЬ Ц
ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, ц1.А * 6 + ц2.А) КАК ДниМесяца
ИЗ
	Ц КАК ц1,
	Ц КАК ц2
ГДЕ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, ц1.А * 6 + ц2.А) < КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
Показать
user712426; dobryak@bk.ru; +2 Ответить
4. andrewks 1378 18.10.12 16:22 Сейчас в теме
жесть какая-то. или порождающий запрос по типу (1), или соединение с произв.календарём, или СКД.
6. nucha 97 18.10.12 18:50 Сейчас в теме
(4) andrewks, пустые слова как у tango. Произвольный календарь в запросе? ну, ну...
9. andrewks 1378 19.10.12 08:07 Сейчас в теме
(6) nucha, не произвольный, а производственный. учите матчасть
20. rhtr 94 09.03.21 19:18 Сейчас в теме
2. wunderland 203 18.10.12 15:31 Сейчас в теме
Тоже вариант, я как-то с єтим парился, но остановился на "заполнить в цикле"
3. tango 546 18.10.12 15:49 Сейчас в теме
вредная публикация
изучайте СКД, глубоко не надо
5. nucha 97 18.10.12 18:46 Сейчас в теме
(3) tango, без примера это пустые слова. Типа: я знаю как, но вам не скажу. Даже для СКД нет примера. А просто в запросе слабо?
sergei2k; +1 Ответить
7. Serj1C 484 18.10.12 19:11 Сейчас в теме
поддерживаю мысль (3), что публикация вредная и вообще не публикация..
8. nucha 97 18.10.12 19:29 Сейчас в теме
1.Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней.
2.В данном случае применение виртуальной таблицы только увеличило время выполнения кода с 0,005433 до 0,005635
и ни чего более.
Публикация создана как пример решения данной задачи, а пока один флуд..
10. andrewks 1378 19.10.12 08:12 Сейчас в теме
(8)
Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней


бред.

В данном случае применение виртуальной таблицы только увеличило время выполнения кода с 0,005433 до 0,005635
и ни чего более


о да, две десятитысячных - это очень крутое достижение. особенно для 1С
11. andrewks 1378 19.10.12 08:15 Сейчас в теме
вот пример решения на основе порождающего запроса:

select
 0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9

;

select
 dateadd(&LeftBound,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num) as Дата
from
 digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
where (dateadd(&LeftBound,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num)<=&RightBound)
order by Дата

Показать


в LeftBound и RightBound задаётся диапазон дат, в результате получаем все даты из заданного диапазона.
Kazaams; ip0593; jamirza; Захаров_Николай; veretennikoff; rhtr; mtv:); +7 Ответить
12. nucha 97 19.10.12 21:39 Сейчас в теме
(11) andrewks, тоже самое, что у меня, только другими словами и в худшем, чем у меня варианте.
Читайте внимательно: пример дан для случаев когда нет произв.календаря. В месяце больше 6 дней, что тут бредового и у кого бред? Суть не только в скорости работы запроса, а в неумелом применении виртуальной таблицы. Пример в (11) в файловом варианте бред.
14. andrewks 1378 22.10.12 08:17 Сейчас в теме
(12) nucha, в моём примере вообще нет виртуальных таблиц. и в файловом варианте всё замечательно работает. может, стоит теорию маленько подучить, да проверить на практике, прежде, чем вступать в дискуссии?

в худшем, чем у меня варианте

ну, это я вообще оставлю без комментариев. всяк кулик имеет право хвалить своё болото.
13. petrov_al 10 20.10.12 20:32 Сейчас в теме
Вот запрос, идея взята у Гилева:
ВЫБРАТЬ
1 КАК цифра
ПОМЕСТИТЬ вт

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

ВЫБРАТЬ
2

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

ВЫБРАТЬ
3

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

ВЫБРАТЬ
4

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

ВЫБРАТЬ
5

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

ВЫБРАТЬ
6

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

ВЫБРАТЬ
7

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

ВЫБРАТЬ
8
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
(вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра КАК цифра,
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2010, 1, 1), ДЕНЬ, (вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра - 1) КАК даты
ИЗ
вт КАК вт,
вт КАК вт1,
вт КАК вт2,
вт КАК вт3
ГДЕ
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2010, 1, 1), ДЕНЬ, (вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра - 1) < ДАТАВРЕМЯ(2011, 1, 1)
15. andrewks 1378 22.10.12 08:18 Сейчас в теме
(13) petrov_al, восьмеричная система? прикольно
16. catena 110 24.10.12 08:55 Сейчас в теме
Как минимум можно заменить хвост запроса:
Код
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28)
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29)
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30)) КАК таб
ГДЕ
   таб.Даты между НачалоПериода(&дат1,Месяц) и КонецПериода(&дат1,Месяц)
Показать полностью


И короче и быстрее будет.
19. nucha 97 24.10.12 18:54 Сейчас в теме
(16) catena, так действительно красивее и короче и быстрее (пардон за рифму).
(17) тема не страшнее Вашего аватара и не хуже Ваших публикаций.
17. absolutblohin 24.10.12 17:24 Сейчас в теме
Самое ужасное что со мной произошло на этой неделе - то что я увидел эту публикацию. Даже вчерашнее посещение стоматолога прошло более приятно.
18. shuhorov 24.10.12 18:17 Сейчас в теме
(17) absolutblohin,
до конца недели еще оого сколько времени
Оставьте свое сообщение