|
Из периода убрать периоды в запросе | ☑ | ||
---|---|---|---|---|
0
Pershin Sergei88
27.12.16
✎
10:22
|
Не пойму как сделать связь в запросе, подскажите куда копать.
Имеем 2 таблицы: 1) Начало | конец 01.01.2016 | 31.12.2016 2) Начало | конец 15.01.2016 | 05.02.2016 01.08.2016 | 10.08.2016 Необходимо получить таблицу Начало | конец 01.01.2016 | 14.01.2016 06.02.2016 | 31.07.2016 11.08.2016 | 31.12.2016 |
|||
1
desaint08
27.12.16
✎
10:26
|
а в третьей таблице колонка "конец"откуда?
|
|||
2
Pershin Sergei88
27.12.16
✎
10:27
|
(1) из первой
|
|||
3
Pershin Sergei88
27.12.16
✎
10:27
|
нужно исключить из первой таблицы периоды 2й
|
|||
4
desaint08
27.12.16
✎
10:27
|
то есть я не пойму как собирается третья таблица,опишите хоть чуть чуть
|
|||
5
Pershin Sergei88
27.12.16
✎
10:29
|
есть год, это запись первой табл., из этого года нужно исключить периоды которые находятся во 2й табл.
|
|||
6
CMblCL
27.12.16
✎
10:29
|
(0) Получается из периодов первой строки "вычитаются" периоды второй строки, и в результате остаются только те дни, которые есть в первой таблице, но остутствуют во второй?
|
|||
7
Pershin Sergei88
27.12.16
✎
10:30
|
(6) верно
|
|||
8
CMblCL
27.12.16
✎
10:30
|
(6) первой таблицы*
второй таблицы* |
|||
9
Pershin Sergei88
27.12.16
✎
10:31
|
(8) смысл ты понял верно
|
|||
10
SeraFim
27.12.16
✎
10:32
|
Внутри каждой таблицы периоды могут пересекаться?
|
|||
11
desaint08
27.12.16
✎
10:37
|
интересно,ищу.
|
|||
12
Pershin Sergei88
27.12.16
✎
10:43
|
(10) внутри таблиц периоды не пересекаются
|
|||
13
osa1C
27.12.16
✎
10:43
|
(0) Что-то на вытеснение похоже. В ЗУП же есть что-то похожее. Я просто ЗУП не занимаюсь
|
|||
14
ГдеСобака Зарыта
27.12.16
✎
10:44
|
Надо Таб 2 привести в линейный вид типа
01.01.2016 |Начало 05.02.2016 |Конец 01.08.2016 |Начало 10.08.2016 |Конец А дальше дело техники |
|||
15
Pershin Sergei88
27.12.16
✎
10:45
|
(13) в зуп есть вытеснение регистрами расчета реализовано. но тут нужно проделать похожее в запросе
уже голову сломал себе этим |
|||
16
Pershin Sergei88
27.12.16
✎
10:47
|
(14) что даст этот линейный вид ?
допустим привел (это не сложно будет сделать) 01.01.2016 |Начало 31.12.2016 |Конец 15.01.2016 |Начало 05.02.2016 |Конец 01.08.2016 |Начало 10.08.2016 |Конец |
|||
17
desaint08
27.12.16
✎
10:50
|
а если попробовать что то типа взять чтото из перваятаблица левое соединение втораятаблица по перваятаблица.начало не между втораятаблица началои вторая таблица конец ),это я так думаю,но опыта у меня мало.
|
|||
18
SeraFim
27.12.16
✎
10:52
|
1. Преобразуешь в таблицу со всеми датами изменения:
Дата 01.01.2016 15.01.2016 05.02.2016 01.08.2016 10.08.2016 31.12.2016 2. Для каждой даты ищешь следующую дату, минимально возможную. От неё отнимаешь 1 день получаешь все возможные периоды. 01.01.2016 - 15.01.2016 15.01.2016 - 05.02.2016 05.02.2016 - 01.08.2016 01.08.2016 - 10.08.2016 10.08.2016 - 31.12.2016 31.12.2016 - неизвестно далее остается исключить ненужные периоды. Как проще? Зависит от начилия пересечений |
|||
19
desaint08
27.12.16
✎
10:55
|
таблица1.дата между таблица1.начало и таблица1.конец <> таблица2.дата между таблица2.начало и таблица2.конец
|
|||
20
SeraFim
27.12.16
✎
10:59
|
+(18)тьфу. Забыл поменять. Правильно так:
1. Преобразуешь в таблицу со всеми датами изменения с учетом того, что "изменения" происходят после даты окончания. Другими словами - даты начала берешь как есть, а к датам окончания прибавляешь 1 день. Дата 01.01.2016 15.01.2016 06.02.2016 01.08.2016 11.08.2016 31.12.2016 2. Для каждой даты ищешь следующую дату, минимально возможную. От неё отнимаешь 1 день получаешь все возможные периоды. 01.01.2016 - 14.01.2016 15.01.2016 - 05.02.2016 06.02.2016 - 31.07.2016 01.08.2016 - 10.08.2016 11.08.2016 - 31.12.2016 01.01.2017 - неизвестно далее остается исключить ненужные периоды. |
|||
21
SeraFim
27.12.16
✎
11:03
|
Пункт 2 делается что-то типа такого (работоспособность не проверял - лень)))
ВЫБРАТЬ ВТДаты.Период КАК ДатаНачала, МИНИМУМ(ЕСТЬNULL(ДОБАВИТЬКДАТЕ(СледующиеИзменения.Период, ДЕНЬ, -1), &КонецМесяца)) КАК ДатаОкончания ПОМЕСТИТЬ ВТПериоды ИЗ ВТДаты КАК ВТДаты ЛЕВОЕ СОЕДИНЕНИЕ ВТДаты КАК СледующиеИзменения ПО ВТДаты.Период < СледующиеИзменения.Период |
|||
22
desaint08
27.12.16
✎
11:08
|
автор отпишись как оно работать будет
|
|||
23
Pershin Sergei88
27.12.16
✎
11:09
|
(22) моделирую идею SeraFim в консоли запросов.
|
|||
24
Pershin Sergei88
27.12.16
✎
11:17
|
||||
25
Pershin Sergei88
27.12.16
✎
11:17
|
ВЫБРАТЬ
&НачалоТ1 КАК Начало, &КонецТ1 КАК конец ПОМЕСТИТЬ ВТТаблица1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ &Начало1Т2 КАК Начало, &Конец1Т2 КАК конец ПОМЕСТИТЬ ВТТаблица2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Начало2Т2, &Конец2Т2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТТаблица1.Начало КАК Период ПОМЕСТИТЬ SeraFim_1 ИЗ ВТТаблица1 КАК ВТТаблица1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВТТаблица2.Начало ИЗ ВТТаблица2 КАК ВТТаблица2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ВТТаблица1.конец, ДЕНЬ, 1) ИЗ ВТТаблица1 КАК ВТТаблица1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ВТТаблица2.конец, ДЕНЬ, 1) ИЗ ВТТаблица2 КАК ВТТаблица2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ SeraFim_1.Период КАК ДатаНачала, МИНИМУМ(ДОБАВИТЬКДАТЕ(СледующиеПериоды.Период, ДЕНЬ, -1)) КАК ДатаКонец ПОМЕСТИТЬ SeraFim_2 ИЗ SeraFim_1 КАК SeraFim_1 ЛЕВОЕ СОЕДИНЕНИЕ SeraFim_1 КАК СледующиеПериоды ПО SeraFim_1.Период < СледующиеПериоды.Период ГДЕ НЕ СледующиеПериоды.Период ЕСТЬ NULL СГРУППИРОВАТЬ ПО SeraFim_1.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ SeraFim_2.ДатаНачала, SeraFim_2.ДатаКонец, ВТТаблица2.Начало, ВТТаблица2.конец ИЗ SeraFim_2 КАК SeraFim_2 ЛЕВОЕ СОЕДИНЕНИЕ ВТТаблица2 КАК ВТТаблица2 ПО SeraFim_2.ДатаНачала = ВТТаблица2.Начало И SeraFim_2.ДатаКонец = ВТТаблица2.конец ГДЕ ВТТаблица2.Начало ЕСТЬ NULL |
|||
26
desaint08
27.12.16
✎
11:17
|
(23) все равно конечный рабочий вариант я посмотрел бы интересная задачка
|
|||
27
Pershin Sergei88
27.12.16
✎
11:18
|
(26) выложил выше
|
|||
28
desaint08
27.12.16
✎
11:23
|
(27) я понял,спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |