Рассчитать дни на основе диапазона дат - PullRequest
2 голосов
/ 23 октября 2019

У меня есть данные, подобные приведенным ниже

create table #Temp(Id int, FromDate date, ToDate date)
Insert into #Temp
values(1,'9/1/2019','9/1/2019'),
        (2,'9/2/2019','9/3/2019'),
        (3,'9/2/2019','9/3/2019'),
        (4,'9/4/2019','9/6/2019'),
        (5,'9/7/2019','9/7/2019')

Я пытаюсь вычислить разницу и создать дни, т. Е. День 1, День 2-3 и т. Д. *

Ожидаемый результат

Id  FromDate    ToDate      Display
1   01/09/2019  01/09/2019  Day 1
2   02/09/2019  03/09/2019  Day 2-3
3   02/09/2019  03/09/2019  Day 2-3
4   04/09/2019  06/09/2019  Day 4-6
5   07/09/2019  07/09/2019  Day 7

Я пробовал приведенный ниже код, используя datediff, но не уверен, как относиться к предыдущей строке и получить диапазон дат

select *, DATEDIFF(DAY,FromDate,ToDate)
from #Temp

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

Использовать first_value

select *
 , datediff(day, first_value(FromDate) over(order by FromDate), FromDate) + 1
 , datediff(day, first_value(FromDate) over(order by FromDate), ToDate) + 1
from #Temp
1 голос
/ 23 октября 2019

Вы можете попробовать это, если хотите точно такой же вывод

Select 
      * ,
     case 
      when (FromDate != ToDate) 
       then 
        'Day '+ DATEPART(Day,FromDate) + '-' + DATEPART(Day,ToDate)
       else
      'Day '+ DATEPART(Day,FromDate)
      END AS Display
    From #Temp
0 голосов
/ 23 октября 2019

Вы не хотите, чтобы значение предыдущей строки, вы хотите самый ранний fromdate, а затем вы можете сравнить его с каждой строкой.

select id, min (fromdate) over (order by fromdate asc) as earliest_date,fromDate,todate,
datediff(day,min (fromdate) over (order by fromdate asc),fromdate)+1,
datediff(day,min (fromdate) over (order by fromdate asc),todate)+1
from
#temp

Fiddle

...