2016-12-14 3 views
0

говоря: У меня есть таблица с «Start» датируетРассчитайте время варьируется от от исходных дат

ID  Start 
1  null  
2  2001-1-1 
3  2002-1-1 

Теперь мне нужно рассчитать эффективное время диапазонов для каждой записи в эффективном способе:

ID  Start  Finish 
1  null  2000-12-31 
2  2001-1-1 2001-12-31 
3  2002-1-1 null 

ответ

2

Использование LEAD:

create table #dates 
(
    ID int, 
    Start date 
) 

insert into #dates values(1,null),(2,'01-jan-2001'),(3,'01-jan-2002') 

select ID, 
    Start, 
    DATEADD(DD, -1, LEAD(Start,1) over (order by Start)) AS Finish 
from #dates 
0

Использование JOIN.

Запрос

select t1.[ID], t1.[Start], 
dateadd(day, -1, t2.[Start]) as [Finish] 
from [your_table_name] t1 
left join [your_table_name] t2 
on t1.ID = t2.ID - 1; 

Demo 1

Как уже упоминалось Habo, если Id не в правильном порядке. Затем укажите порядковый номер строки на ID.

Запрос

;with cte as(
    select [row_num] = row_number() over(
    order by [ID] 
),* 
    from [your_table_name] 
) 
select t1.[ID], t1.[Start], 
dateadd(day, -1, t2.[Start]) as [Finish] 
from cte t1 
left join cte t2 
on t1.[row_num] = t2.[row_num] - 1; 

Demo 2

+0

Стоит отметить, что это требует, чтобы 'значения ID' остаются плотными. – HABO

Смежные вопросы