Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разделение дат на периоды  [new]
Halfling
Member

Откуда:
Сообщений: 260
Здравствуйте, помогите с запросом. Нужно разделить даты на периоды. Смысл в том, что есть вложенные периоды, нужно разбить родительский период на два: до и после.
Пример:

Исходная таблица:
idd_begind_end
12008-04-01 2009-05-31
22008-07-28 2008-08-24
32009-06-01 2010-03-31
42009-07-20 2009-08-02

Результат должен быть примерно такой:
idd_begind_end
12008-04-01 2008-07-27
22008-07-28 2008-08-24
52008-08-25 2009-05-31
32009-06-01 2009-07-19
42009-07-20 2009-08-02
62009-08-03 2010-03-31
22 ноя 11, 12:43    [11636942]     Ответить | Цитировать Сообщить модератору
 Re: Разделение дат на периоды  [new]
Halfling
Member

Откуда:
Сообщений: 260
create table #tmp(id int, d_begin datetime, d_end datetime)

insert into #tmp (id, d_begin, d_end) values (1, '2008-04-01', '2009-05-31')
insert into #tmp (id, d_begin, d_end) values (2, '2008-07-28', '2008-08-24')
insert into #tmp (id, d_begin, d_end) values (3, '2009-06-01', '2010-03-31')
insert into #tmp (id, d_begin, d_end) values (4, '2009-07-20', '2009-08-02')

Microsoft SQL Server 2005 - 9.00.4060.00 (X64)   Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
22 ноя 11, 13:11    [11637177]     Ответить | Цитировать Сообщить модератору
 Re: Разделение дат на периоды  [new]
Glory
Member

Откуда:
Сообщений: 104751
Halfling
Смысл в том, что есть вложенные периоды,

И каков уровень вложенности ?
22 ноя 11, 13:18    [11637246]     Ответить | Цитировать Сообщить модератору
 Re: Разделение дат на периоды  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
create table #tmp(id int, d_begin datetime, d_end datetime)
go
insert into #tmp (id, d_begin, d_end) values (1, '2008-04-01', '2009-05-31')
insert into #tmp (id, d_begin, d_end) values (2, '2008-07-28', '2008-08-24')
insert into #tmp (id, d_begin, d_end) values (3, '2009-06-01', '2010-03-31')
insert into #tmp (id, d_begin, d_end) values (4, '2009-07-20', '2009-08-02')

--select * from #tmp
;with tmp as
 (
  select       d=d_begin               from #tmp
  union select dateadd(day,-1,d_begin) from #tmp
  union select d_end                   from #tmp
  union select dateadd(day,1,d_end)    from #tmp
 ),
tmp2 as
 (select id = row_number() over (order by d), d from tmp)
select
  id      = t2.id/2,
  d_begin = cast(t1.d as date),
  d_end   = cast(t2.d as date)
from
  tmp2 t1 join tmp2 t2 on t2.id = t1.id+1
where 1=1
  and t1.id > 1
  and t1.id%2=0
go
drop table #tmp
22 ноя 11, 13:36    [11637424]     Ответить | Цитировать Сообщить модератору
 Re: Разделение дат на периоды  [new]
aleks2
Guest
declare @tmp table (id int, d_begin datetime, d_end datetime)

insert into @tmp (id, d_begin, d_end) values (1, '20080401', '20090531')
insert into @tmp (id, d_begin, d_end) values (2, '20080728', '20080824')
insert into @tmp (id, d_begin, d_end) values (3, '20090601', '20100331')
insert into @tmp (id, d_begin, d_end) values (4, '20090720', '20090802')

;with
[all] as( select d_begin as [date], 1 f FROM @tmp
        union all
        select d_end as [date], 0 f FROM @tmp
)
,
alln as (select *, ROW_NUMBER() OVER(order by [date] ASC) n FROM [all])
--select * from alln

select t1.[date]+1-t1.f d_begin, t2.[date]-t2.f d_end
from alln t1 inner join alln t2 on t1.n+1=t2.n AND not (t1.f=0 and t2.f=1)
order by t1.[date]
22 ноя 11, 13:45    [11637520]     Ответить | Цитировать Сообщить модератору
 Re: Разделение дат на периоды  [new]
Halfling
Member

Откуда:
Сообщений: 260
Glory, 1 уровень вложенности.
Prolog, aleks2, спасибо. Вторым вариантом воспользуюсь.
22 ноя 11, 13:58    [11637631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить