3

Alright, let's say I have a table that looks like this:

 ID   | DATE
 2  | 2010-08-12
 2  | 2010-08-16 
 2  | 2010-08-17 
 2  | 2010-12-21 
 2  | 2010-12-22 
 2  | 2011-05-25 

anyone have an idea on how to query it so the data looks like

 ID   | STARTDATE  | ENDDATE
 2  | 2010-08-12 | 2010-08-15
 2  | 2010-08-16 | 2010-08-16
 2  | 2010-08-17 | 2010-12-20
 2  | 2010-12-21 | 2010-12-21
 2  | 2010-12-22 | 2010-05-25
James
  • 562
  • 3
  • 9
  • 17

3 Answers3

5

I will not put here the ID as I see it is irrelevant in the query. If you wish you will put it later. This is a MSSQL query.

select tb1.date as startdate,dateadd(d,-1,tb2.date) as enddate
from the_table tb1
join the_table tb2 on tb2.date>tb1.date
left join the_table tb3 on tb1.date<tb3.date and tb3.date<tb2.date
where tb3.date is null

It can be easily translated for other DB types.

Dumitrescu Bogdan
  • 6,842
  • 2
  • 22
  • 31
1

These two links will give you a rough idea.

Community
  • 1
  • 1
Saurabh Gokhale
  • 51,864
  • 34
  • 134
  • 163
1

if you have serialize id like ( 1,2,3,4,5,..) then you can get the above with this query with 1 extra data at last but you can omit that the folloowing is the mysql query

SELECT startdate, ( select startdate - INTERVAL 1 DAY from tester a where a.id = b.id +1) as enddate FROM tester b

Ujjwal Manandhar
  • 2,158
  • 16
  • 20