|
Построить запрос про ближайший рабочий день | ☑ | ||
---|---|---|---|---|
0
nesta sandro
26.02.16
✎
15:09
|
Привет всем,
Есть РС РегламентированныйПроизводственныйКалендарь, надо только запросом получить таблицу, в которой календарный день по порядку, затем ближаший N-ый рабочий день, где N любое целое число. Для 1 января будет день 11 января в 2016 году, для 2 января тоже и т.д. до 9 января - будет 12 января 2016 и т.д. Помогите составить запрос, мозг сломал. |
|||
1
ObjectRelation Model
26.02.16
✎
15:10
|
собеседование?
|
|||
2
nesta sandro
26.02.16
✎
15:12
|
типа того :)
|
|||
3
Mikeware
26.02.16
✎
15:13
|
(2) а работать как будешь?
|
|||
4
mehfk
26.02.16
✎
15:14
|
Покажи что уже написал.
|
|||
5
nesta sandro
26.02.16
✎
15:15
|
(3) в остальном все ок, просто запросы с датами не сильный конек.
|
|||
6
nesta sandro
26.02.16
✎
15:15
|
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДеньКалендаря, ВложенныйЗапрос.ДатаКалендаря КАК РабочийДень ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ (РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))) КАК ВложенныйЗапрос ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = ВложенныйЗапрос.ДатаКалендаря ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаКонца |
|||
7
фобка
26.02.16
✎
15:16
|
Былоб чо ломать...
Select min (rs.day) from rs as rs where rs.type = "rabo4ij" and rs.day >&day order by rs.day |
|||
8
nesta sandro
26.02.16
✎
15:16
|
Это просто календарный день и рабочий день. Теперь как-то организовать смещение на N дней.
|
|||
9
nesta sandro
26.02.16
✎
15:18
|
да с параметром понятно все, а в таблице.
|
|||
10
фобка
26.02.16
✎
15:19
|
ну чуть сложнее в джойне виесто параметра день из первой таблицы + н-дней
|
|||
11
nesta sandro
26.02.16
✎
15:20
|
(10) не получится.
|
|||
12
фобка
26.02.16
✎
15:21
|
В джойне 1С во вложенном запросе позволяет указывать поле другой таблицы
|
|||
13
nesta sandro
26.02.16
✎
15:22
|
(12) пример? видимо не допонимаю.
|
|||
14
фобка
26.02.16
✎
15:25
|
Select t1.a t2.b from t1 t1 join (select t2.a from t2 t2 where t2.b< t1.b) t2 on t2.a = t1.a
|
|||
15
фобка
26.02.16
✎
15:27
|
select t1.a, t2.b - пропустил зпт
|
|||
16
nesta sandro
26.02.16
✎
15:30
|
(14) 1С так не может.
|
|||
17
kumena
26.02.16
✎
15:30
|
задача на 10 минут
|
|||
18
фобка
26.02.16
✎
15:32
|
(16) да брось ты
|
|||
19
nesta sandro
26.02.16
✎
15:36
|
(17) ок возможно, жду решение. спасибо.
|
|||
20
kumena
26.02.16
✎
15:39
|
(19)
ок, решение Выбрать ДатаКалендаря Поместить СписокДат Из РегистрСведений.РегламентированныйПроизводственныйКалендарь Где НачалоПериода(ДатаКалендаря, Месяц) = ДатаВремя(2016, 01, 01) ; Выбрать СписокДат.ДатаКалендаря ,Минимум(Календарь.ДатаКалендаря) КАК РабочийДень Из СписокДат КАК СписокДат Левое соединение РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь По ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) и СписокДат.ДатаКалендаря < Календарь.ДатаКалендаря Сгруппировать по СписокДат.ДатаКалендаря с тебя 500 р. |
|||
21
Alexandr_U1982
26.02.16
✎
15:39
|
ВЫБРАТЬ
ВсеДниКалендаря.ДатаКалендаря КАК ДеньКалендаря, МИНИМУМ(РабочиеДниКалендаря.ДатаКалендаря) КАК РабочийДень ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ВсеДниКалендаря ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РабочиеДниКалендаря ПО (РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) ИЛИ РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) И (ДОБАВИТЬКДАТЕ(ВсеДниКалендаря.ДатаКалендаря, ДЕНЬ, &КоличествоДней) <= РабочиеДниКалендаря.ДатаКалендаря) ГДЕ ВсеДниКалендаря.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания СГРУППИРОВАТЬ ПО ВсеДниКалендаря.ДатаКалендаря УПОРЯДОЧИТЬ ПО ДеньКалендаря |
|||
22
Alexandr_U1982
26.02.16
✎
15:41
|
(20) Не учитываешь предпраздничные дни
|
|||
23
kumena
26.02.16
✎
15:43
|
(22) сам догадается, на халяву еще и со всеми проверками жирно будет.
|
|||
24
фобка
26.02.16
✎
15:49
|
(14) немного не так написал, неудобно с телефона
(16) ВЫБРАТЬ Р1.ДатаКалендаря, Р2.ДатаКалендаря, ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Р1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Р2 ПО (Р2.ДатаКалендаря В ВЫБРАТЬ МИНИМУМ(Р3.ДатаКалендаря) КАК ДатаКалендаря ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Р3 ГДЕ Р3.ВидДня = &Рабочий И Р3.ДатаКалендаря > ДОБАВИТЬКДАТЕ(Р1.ДатаКалендаря, ДЕНЬ, &КолДней))) |
|||
25
nesta sandro
26.02.16
✎
16:16
|
(24) (21) (20) :))) я, видимо, запаренный делаю. У меня был вариант, как 21, только с ВсеДниКалендаря.ДатаКалендаря<=ДобавитьКДате(РабочиеДниКалендаря,День,-3). Потом паническую атаку словил и начал сначала с того, что сначала видели.
Спасибо, коллеги. :)))) |
|||
26
Alexandr_U1982
26.02.16
✎
16:20
|
(25) Еще вот так можно:
ВЫБРАТЬ ВсеДниКалендаря.ДатаКалендаря КАК ДеньКалендаря, МИНИМУМ(РабочиеДниКалендаря.ДатаКалендаря) КАК РабочийДень ПОМЕСТИТЬ ВТ_Данные ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ВсеДниКалендаря ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РабочиеДниКалендаря ПО (РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) ИЛИ РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) И ВсеДниКалендаря.ДатаКалендаря <= РабочиеДниКалендаря.ДатаКалендаря ГДЕ ВсеДниКалендаря.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания СГРУППИРОВАТЬ ПО ВсеДниКалендаря.ДатаКалендаря ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВсеДниКалендаря.ДеньКалендаря КАК ДеньКалендаря, РабочиеДниКалендаря.РабочийДень ИЗ ВТ_Данные КАК ВсеДниКалендаря ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК РабочиеДниКалендаря ПО (ВсеДниКалендаря.РабочийДень = ДОБАВИТЬКДАТЕ(РабочиеДниКалендаря.ДеньКалендаря, ДЕНЬ, -&КоличествоДней)) УПОРЯДОЧИТЬ ПО ДеньКалендаря Это если требуется показать N-й рабочий день |
|||
27
aleks_default
26.02.16
✎
16:25
|
хорошо на мисте, работодатели решают задачки своих же соискателей.
|
|||
28
alle68
27.02.16
✎
07:16
|
Пока верного решения (для N >= 2) нет.
|
|||
29
Alexandr_U1982
04.03.16
✎
10:49
|
(28) Да неужели? ))
|
|||
30
cathode
04.03.16
✎
14:11
|
(29) Точно, для 25.01.2016 и N = 5 не работает.
|
|||
31
cathode
04.03.16
✎
14:21
|
(0) Предлагаю свой вариант. Он работает, но может быть неэффективным для больших N.
ВЫБРАТЬ К.ДатаКалендаря КАК Дата , МИНИМУМ(ПР.ДатаКалендаря) КАК НачалоИнтервала // Смысл манипуляции: превратить рабочие дни в календарные // и добавить максимальный непрерывный нерабочий период, который // может быть с учетом праздников. Округлить в большую сторону. , ДОБАВИТЬКДАТЕ(К.ДатаКалендаря, ДЕНЬ, ВЫРАЗИТЬ((&КоличествоДней * 7 / 5) + 11 КАК ЧИСЛО(10, 0))) КАК КонецИнтервала ПОМЕСТИТЬ ВТ_ИнтервалыРабочихДней ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ПР // Если ближайшим рабочим днем для рабочего дня считается следующий, ставим > // Если ближайшим рабочим днем для рабочего дня считается текущий, ставим >= ПО ПР.ДатаКалендаря > К.ДатаКалендаря И ПР.ВидДня В ( ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) , ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) ) ГДЕ К.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода СГРУППИРОВАТЬ ПО К.ДатаКалендаря ИНДЕКСИРОВАТЬ ПО Дата ; ВЫБРАТЬ ИР.Дата КАК Дата , РД.ДатаКалендаря КАК РабочийДень ПОМЕСТИТЬ ВТ_РабочиеДни ИЗ ВТ_ИнтервалыРабочихДней КАК ИР ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РД ПО РД.ДатаКалендаря >= ИР.НачалоИнтервала И РД.ДатаКалендаря <= ИР.КонецИнтервала И РД.ВидДня В ( ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) , ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) ) ИНДЕКСИРОВАТЬ ПО Дата , РабочийДень ; ВЫБРАТЬ РД1.Дата КАК Дата , РД1.РабочийДень КАК РабочийДень ИЗ ВТ_РабочиеДни КАК РД1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РабочиеДни КАК РД2 ПО РД2.Дата = РД1.Дата И РД2.РабочийДень <= РД1.РабочийДень СГРУППИРОВАТЬ ПО РД1.Дата , РД1.РабочийДень ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = &КоличествоДней УПОРЯДОЧИТЬ ПО Дата |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |