Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Запросик  [new]
тУпик
Guest
Есть таблица, записях в которой указаны периоды дат

Например:
Id    datefrom     dateto
1     01.01.2000  10.01.2000
2     02.01.2000  06.01.2000
3     01.01.2000  18.01.2000
4     12.01.2000  20.01.2000

Необходимо достать количество дней, покрываемых этими периодами,
но с учетом того, что сами периоды тоже перекрывают друг друга.
То есть просто
Sum(dateto-datefrom)

не подходит, так как третий период перекрывает все другие периоды
второй период целиком внутри первого периода, то есть его можно вообще не учитывать (как бы)
Надесюь, суть понятно объяснил.

Сам думаю, что надо как-то (пока не придумал как) размножить записи
то есть каждый пеирод превратить в несколько записей с датами периода
потом все даты схлопнуть по UNION и взять Count.
Но по-моему, это будет извращением, может есть какие-то более гуманные варианты?
31 авг 10, 11:55    [9354796]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
тУпик
Guest
То есть у меня только такой вариант:
select Count(distinct DateFrom+level) from             
(select to_date('01.01.2000','dd.mm.yyyy') DateFrom, 
       to_date('10.01.2000','dd.mm.yyyy') DateTo
 from dual
 union all
 select to_date('01.01.2000','dd.mm.yyyy') DateFrom, 
       to_date('06.01.2000','dd.mm.yyyy') DateTo
 from dual)
connect by level<=(DateTo-DateFrom)+1
31 авг 10, 12:02    [9354863]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
тУпик
Guest
аааа для сельской местности сойдет наверно...
но если есть более гуманные варианты, буду рад увидеть.
31 авг 10, 12:04    [9354876]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
тУпик,

Фактически ваша задача найти начало и конец группы периодов, так что
stff start of group
31 авг 10, 12:08    [9354908]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
dfasdfZXcD
Guest
max(dateto) - min(datefrom)
31 авг 10, 12:10    [9354926]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
тУпик
Guest
env
Фактически ваша задача найти начало и конец группы периодов

Именно, Вы правильно поняли.
Про start of group не слышал, по форму сходу не нашел тоже что за зверь :)
31 авг 10, 12:11    [9354934]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
AmKad
Member

Откуда:
Сообщений: 5222
dfasdfZXcD
max(dateto) - min(datefrom)

А если периоды не пересекаются?
31 авг 10, 12:11    [9354937]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
тУпик
Guest
dfasdfZXcD, max(dateto) - min(datefrom) не вариант, так как между периодами могут быть окна.

Например
две периода
01.01.2000 - 10.01.2000
20.01.2000 - 25.01.2000

правильным ответом будет 15 дней,
а max(dateto) - min(datefrom) вернет 25
31 авг 10, 12:13    [9354963]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
тУпик,

Плохо искали?
31 авг 10, 12:16    [9354987]     Ответить | Цитировать Сообщить модератору
 Re: Запросик  [new]
тУпик
Guest
env, вот это действительно здорово!
Скорость потрясающая - c моим вариантом вообще ни в какое сравнение не идет.
Спасибо большое.
31 авг 10, 12:46    [9355339]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить