OK,
Here goes a better attempt without a quirky update...
Again using @Phil Factor's test data:
declare @Dt table (TestDate DateTime)
insert into @dt (testdate) values
(convert(datetime,'26/07/2010 1:00:03',103)),
(convert(datetime,'26/07/2010 1:00:04',103)),
(convert(datetime,'26/07/2010 1:00:05',103)),
(convert(datetime,'26/07/2010 1:00:06',103)),
(convert(datetime,'26/07/2010 1:00:07',103)),
(convert(datetime,'26/07/2010 1:00:25',103)),
(convert(datetime,'26/07/2010 1:00:50',103)),
(convert(datetime,'26/07/2010 1:00:51',103)),
(convert(datetime,'26/07/2010 1:00:52',103)),
(convert(datetime,'26/07/2010 1:00:53',103)),
(convert(datetime,'26/07/2010 1:00:54',103)),
(convert(datetime,'26/07/2010 1:00:55',103)),
(convert(datetime,'26/07/2010 1:00:56',103)),
(convert(datetime,'26/07/2010 1:00:57',103)),
(convert(datetime,'26/07/2010 1:00:58',103)),
(convert(datetime,'26/07/2010 1:00:59',103)),
(convert(datetime,'26/07/2010 1:01:00',103)),
(convert(datetime,'26/07/2010 1:01:01',103)),
(convert(datetime,'26/07/2010 1:01:02',103)),
(convert(datetime,'26/07/2010 1:01:03',103)),
(convert(datetime,'26/07/2010 1:01:04',103)),
(convert(datetime,'26/07/2010 1:50:37',103)),
(convert(datetime,'26/07/2010 1:50:38',103)),
(convert(datetime,'26/07/2010 1:50:39',103)),
(convert(datetime,'26/07/2010 1:50:40',103)),
(convert(datetime,'26/07/2010 1:50:41',103)),
(convert(datetime,'26/07/2010 1:50:42',103)),
(convert(datetime,'26/07/2010 1:50:43',103)),
(convert(datetime,'26/07/2010 1:50:44',103)),
(convert(datetime,'27/07/2010 2:20:37',103)),
(convert(datetime,'27/07/2010 2:20:38',103)),
(convert(datetime,'27/07/2010 2:20:39',103)),
(convert(datetime,'27/07/2010 2:20:40',103)),
(convert(datetime,'27/07/2010 2:20:41',103)),
(convert(datetime,'27/07/2010 2:20:42',103)),
(convert(datetime,'27/07/2010 2:20:43',103)),
(convert(datetime,'27/07/2010 2:20:44',103))
SELECT MIN(TestDate) AS [Start], MAX(TestDate) as [End]
FROM (
SELECT TestDate,
(DATEADD(second, - ROW_NUMBER() OVER(ORDER BY TestDate), TestDate)) AS dategroup
FROM @Dt) AS DR
GROUP BY dategroup;
This returns:
Start End
2010-07-26 01:00:03.000 2010-07-26 01:00:07.000
2010-07-26 01:00:25.000 2010-07-26 01:00:25.000
2010-07-26 01:00:50.000 2010-07-26 01:01:04.000
2010-07-26 01:50:37.000 2010-07-26 01:50:44.000
2010-07-27 02:20:37.000 2010-07-27 02:20:44.000
Just throwing this one in because it was driving me crazy ;)
----------
**EDIT**
This works because the date increment is a consistent 1 (every second), the same increment as the row numbering. Therefore date - row number seconds will produce a value that is the same for a set of contiguous dates - hence a grouping key.
1:00:03 - 1 = 1:00:02
1:00:04 - 2 = 1:00:02
1:00:05 - 3 = 1:00:02
1:00:06 - 4 = 1:00:02
1:00:07 - 5 = 1:00:02
1:00:25 - 6 = 1:00:19
1:00:50 - 7 = 1:00:43
1:00:51 - 8 = 1:00:43
1:00:52 - 9 = 1:00:43
...
It is evident then that the first five entries are from the 1:00:02 "group" and the 6th belongs to the 1:00:19 "group" and so on down the list.
↧