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

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)

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

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159554    874    399    

862

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

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

18.10.2024    9897    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    5187    XilDen    36    

80

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

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

16.08.2024    7915    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2396    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8700    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3392    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Serj1C 483 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 1375 18.10.12 16:22 Сейчас в теме
жесть какая-то. или порождающий запрос по типу (1), или соединение с произв.календарём, или СКД.
6. nucha 97 18.10.12 18:50 Сейчас в теме
(4) andrewks, пустые слова как у tango. Произвольный календарь в запросе? ну, ну...
9. andrewks 1375 19.10.12 08:07 Сейчас в теме
(6) nucha, не произвольный, а производственный. учите матчасть
20. rhtr 92 09.03.21 19:18 Сейчас в теме
2. wunderland 202 18.10.12 15:31 Сейчас в теме
Тоже вариант, я как-то с єтим парился, но остановился на "заполнить в цикле"
3. tango 545 18.10.12 15:49 Сейчас в теме
вредная публикация
изучайте СКД, глубоко не надо
5. nucha 97 18.10.12 18:46 Сейчас в теме
(3) tango, без примера это пустые слова. Типа: я знаю как, но вам не скажу. Даже для СКД нет примера. А просто в запросе слабо?
sergei2k; +1 Ответить
7. Serj1C 483 18.10.12 19:11 Сейчас в теме
поддерживаю мысль (3), что публикация вредная и вообще не публикация..
8. nucha 97 18.10.12 19:29 Сейчас в теме
1.Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней.
2.В данном случае применение виртуальной таблицы только увеличило время выполнения кода с 0,005433 до 0,005635
и ни чего более.
Публикация создана как пример решения данной задачи, а пока один флуд..
10. andrewks 1375 19.10.12 08:12 Сейчас в теме
(8)
Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней


бред.

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


о да, две десятитысячных - это очень крутое достижение. особенно для 1С
11. andrewks 1375 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 1375 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 1375 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,
до конца недели еще оого сколько времени
Оставьте свое сообщение