![]() |
| ||
|
|
Новости |
Поиск |
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
ANB (2005-05-27 14:24:00) [1]
> paul_k © (27.05.05 14:16) [36]
По моему ты мне и sniknik пиво должен.
paul_k (2005-05-27 14:16:00) [2]Danilka © (27.05.05 13:50) [35]
А CASE уже sniknik написал
Danilka (2005-05-27 13:50:00) [3][21] sniknik © (27.05.05 11:44)
угу, что-то я case совсем упустил из виду, видимо с голодухи перед обедом. :)
[34] paul_k © (27.05.05 12:11)
не понял, достаточно для чего? в сабже нет никаких варчаров, и количество полей в результирующем наборе данных не 6, а 4. :)
paul_k (2005-05-27 12:11:00) [4]прошу прощения варианта
select convert(varchar,T1.d1,4) t1d1,
convert(varchar,T1.d2,4) t1d2,
convert(varchar,T2.d1,4) t2d1,
convert(varchar,T2.d2,4) t2d2,
n1,
n2
from Table1 t1,Table2 t2
where (t1.d1 <= t2.d2 and t1.d2 >= t2.d1)
вполне достаточно
paul_k (2005-05-27 12:10:00) [5]мать перемать.. когда я данные забивать начну правильно..
у меня вторая строка 1-й таблицы из 4-го года...
paul_k (2005-05-27 12:07:00) [6]ANB © (27.05.05 12:02) [31]
а на данных "клиента" тестировал?
t1d1 t1d2 t2d1 t2d2 n1 n2
------------------------------ ------------------------------ ------------------------------ ------------------------------ ----------- -----------
01.04.05 30.04.05 01.04.05 15.04.05 1 20
01.04.05 30.04.05 16.04.05 15.05.05 1 25
ANB (2005-05-27 12:02:00) [7]Сорри, это у меня по планированию запрос был - это вхождение первого во второе.
То есть надо так :
where (t1.d1 <= t2.d2 and t1.d2 >= t2.d1)
or (t2.d1 <= t1.d2 and t2.d2 >= t1.d1)
paul_k (2005-05-27 11:53:00) [8]сорри 2 записи:)
t1d1 t1d2 n1
------------------------------ ------------------------------ -----------
01.04.05 30.04.05 1
01.05.04 31.05.04 2
(2 row(s) affected)
t2d1 t2d2 n2
------------------------------ ------------------------------ -----------
01.04.05 15.04.05 20
16.04.05 15.05.05 25
16.05.05 31.05.05 30
(3 row(s) affected)
t1d1 t1d2 t2d1 t2d2 n1 n2
------------------------------ ------------------------------ ------------------------------ ------------------------------ ----------- -----------
01.04.05 30.04.05 01.04.05 15.04.05 1 20
01.04.05 30.04.05 16.04.05 15.05.05 1 25
paul_k (2005-05-27 11:53:00) [9]select convert(varchar,T1.d1,4) t1d1,
convert(varchar,T1.d2,4) t1d2,
T1.n1
from Table1 t1
select convert(varchar,T2.d1,4) t2d1,
convert(varchar,T2.d2,4) t2d2,
T2.n2
from Table2 t2
select convert(varchar,T1.d1,4) t1d1,
convert(varchar,T1.d2,4) t1d2,
convert(varchar,T2.d1,4) t2d1,
convert(varchar,T2.d2,4) t2d2,
n1,
n2
from Table1 t1,Table2 t2
where t1.d1 <= t2.d2 and t1.d2 >= t2.d1
sniknik (2005-05-27 11:50:00) [10]ANB © (27.05.05 11:46) [24]
а он после будет напрягаться, логические ошибки вылавливать развлечение еще то. ;о))
ANB (2005-05-27 11:49:00) [11]Данные и запрос в студию.
sniknik (2005-05-27 11:48:00) [12]только это все одно не логика, а подгонка к результату... ну если пойдет так, ну значит и слава гейтцу билу. ;)
paul_k (2005-05-27 11:48:00) [13]ANB © (27.05.05 11:44) [22]
1 запись
ANB (2005-05-27 11:46:00) [14]
> sniknik © (27.05.05 11:44) [21]
- не, ну case можно было и вопрошающего написать заставить. Чтобы не расслаблялся.
sniknik (2005-05-27 11:45:00) [15]поправка. вместо второго AS DateBegin естественно нужно AS DateEnd
ANB (2005-05-27 11:44:00) [16]
> paul_k © (27.05.05 11:43) [20]
- возми мой запрос. Ему уже 10 лет. И до сих пор работает.
sniknik (2005-05-27 11:44:00) [17]> дык, я потом написал - как надо:
угу, уже видел
итого
SELECT
CASE WHEN T1.DateBegin > T2.DateBegin THEN T1.DateBegin ELSE T2.DateBegin END AS DateBegin,
CASE WHEN T1.DateEnd < T2.DateEnd THEN T1.DateEnd ELSE T2.DateEnd END AS DateBegin,
T1.Factor, T2.PR
FROM Tab1 T1, Tab2 T2
WHERE T1.DateBegin < T2.DateEnd and T1.DateEnd > T2.DateBegin
paul_k (2005-05-27 11:43:00) [18]чет я не понимаю
> Danilka © (27.05.05 11:30) [15][Ответить]
select convert(varchar,T1.d1,4) t1d1,
convert(varchar,T1.d2,4) t1d2,
convert(varchar,T2.d1,4) t2d1,
convert(varchar,T2.d2,4) t2d2,
n1,
n2
from Table1 t1,Table2 t2
where (t1.d1 between t2.d1 and t2.d2)
or (t1.d2 between t2.d1 and t2.d2)
хронически возвращает 1 запись:)
Danilka (2005-05-27 11:40:00) [19][18] sniknik © (27.05.05 11:36)
дык, я потом написал - как надо: DateBegin надо брать максимальное из T1.DateBegin и T2.DateBegin, а DateEnd - наоборот минимальное из T1.DateEnd и T2.DateEnd
:)
sniknik (2005-05-27 11:36:00) [20]ну не, так не интересно.
что
ANB © (27.05.05 11:10) [8]
что
Danilka © (27.05.05 11:30) [15]
просто вывели все поля с датами, а в выборе нужных как раз весь "цынус" ;о))
> правда, кажись, нет в МС-Скуле Ороклового GREATEST и LEAST, чтобы из четырех полей с датами в резулитующем наборе собрать два.
вместо них есть CASE, приводи как можеш на оракле, я переведу. (если получится ;)