![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пересечение промежутков дат [D5, MSSQL]
MakNik © (2005-05-27 10:43:00)есть 2 таблицы, содержащие промежутки дат:
Tab1:
DateBegin | DateEnd | Factor
-------------------------------
01.04.2005 | 30.04.2005 | 1
01.05.2005 | 31.05.2005 | 2
...
Tab2:
DateBegin | DateEnd | PR
-------------------------------
01.04.2005 | 15.04.2005 | 20
16.04.2005 | 15.05.2005 | 25
16.05.2005 | 31.05.2005 | 30
...
Помогите, пожалуйста, написать запрос, чтобы получить следующее пересечение таблиц 1 и 2:
Tab3:
DateBegin | DateEnd | Factor | PR
--------------------------------------
01.04.2005 | 15.04.2005 | 1 | 20
16.04.2005 | 30.04.2005 | 1 | 25
01.05.2005 | 15.05.2005 | 2 | 25
16.05.2005 | 31.05.2005 | 2 | 30
Danilka (2005-05-27 11:34:00) [21][16] MakNik (27.05.05 11:32)
См [15], только в рез. DateBegin надо брать максимальное из T1.DateBegin и T2.DateBegin, а DateEnd - наоборот минимальное. Тогда получится один в один с твоим сабжевым примером.
MakNik (2005-05-27 11:32:00) [22]
> Johnmen © (27.05.05 11:20) [12]
для каждого промежутка времени нужно получить все возможные варианты значений Factor и PR.
Danilka (2005-05-27 11:30:00) [23]что-то типа:
SELECT
T1.DateBegin, T1.DateEnd, T2.DateBegin, T2.DateEnd,
T1.Factor, T2.PR
FROM Tab1 T1, Tab2 T2
WHERE T1.DateBegin BETWEEN T2.DateBegin AND T2.DateEnd
OR T1.DateEnd BETWEEN T2.DateBegin AND T2.DateEnd
?
правда, кажись, нет в МС-Скуле Ороклового GREATEST и LEAST, чтобы из четырех полей с датами в резулитующем наборе собрать два.
:)
sniknik (2005-05-27 11:25:00) [24]а мне интересно по какой логике берутся поля DateBegin/DateEnd то из первой то из второй таблици.
MakNik (2005-05-27 11:23:00) [25]
> paul_k © (27.05.05 11:10) [9]
именно это и нужно реализовать
Johnmen (2005-05-27 11:20:00) [26]>paul_k © (27.05.05 11:10) [9]
Взяли из 1, пересекли, получили N пересечений с PR = 20 и 30.
Так куда теперь девать 20 и 30 ? Какое из них нам надо ?
ЗЫ Задача о пересечении отрезков решается несложно. Весь вопрос в остальных полях...
ANB (2005-05-27 11:17:00) [27]Это обычное пересечение интервалов. Если нужно что то другое - нужно подробнее писать ТЗ.
paul_k (2005-05-27 11:11:00) [28]
> ANB © (27.05.05 11:10) [8] [Новое
> сообщение][Ответить]
не настолько однозначно...
paul_k (2005-05-27 11:10:00) [29]берем интервал из таблицы 1 и значение фактор
пересекаем со всеми значениями из таблицы 2 пересекающимися с ним
получаем первые две строчки
берем второй интервал из таблицы один и делаем тож самое
задачка то интересная.. надо попробовать порешать
ANB (2005-05-27 11:10:00) [30]CREATE TABLE TBL1
(
D1 DATE,
D2 DATE,
N1 NUMBER
)
CREATE TABLE TBL2
(
D1 DATE,
D2 DATE,
N2 NUMBER
)
select * from tbl1, tbl2
where tbl1.d1 < tbl2.d2 and tbl1.d2 > tbl2.d1
Выбор дат DateBegin и DateEnd сделай через case
sniknik (2005-05-27 11:05:00) [31]paul_k © (27.05.05 11:01) [5]
обьясни ты, если понял. я вот тоже чтото не "врубаюсь". как ни смотрел не понимаю что с чем пересекается. (логика) если дополнительно смотреть на значения Factor и PR.
sniknik (2005-05-27 11:03:00) [32]> Теперь на пальцах расскажи логику.
;о)))
Купил новую мясорубку.
Вчера пробовал.
Наконец-то понял, что означает фраза: "Объясни мне на пальцах, как оно работает".
> ... в общем нужно получить все возможные пересечения значений из Tab1 с Tab2
это не все, все, это будет простой запрос с гетерогенным обьедением (те. без усекающих условий)
типа того
SELECT * FROM Tab1, Tab2
но это будет явно отличатся от Tab3, и очень сильно...
paul_k (2005-05-27 11:01:00) [33]
> Johnmen © (27.05.05 10:51) [2]
логику он вроде написал
насколько я вижу там перечечение интервалов
то есть если интервалы пересекаются то берет наиболее позднее начало из наиболее раннее окончание из двух инетрвалов.
Johnmen (2005-05-27 11:00:00) [34]Абсолютно непонятно.
Напр. что д.б. в итоге в Factor и PR.
MakNik (2005-05-27 10:56:00) [35]
> Теперь на пальцах расскажи логику.
... в общем нужно получить все возможные пересечения значений из Tab1 с Tab2
Johnmen (2005-05-27 10:51:00) [36]Хорошо.
Теперь на пальцах расскажи логику.
Paul_K (2005-05-27 10:49:00) [37]жать F1 читать про конструкцию CASE