Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пересечение промежутков дат [D5, MSSQL]


Страницы:   1 2

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, приводи как можеш на оракле, я переведу. (если получится ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо