Quantcast
Channel: Answers for "Selecting multiple ranges from a set of dates"
Viewing all articles
Browse latest Browse all 12

Answer by Blackhawk-17

$
0
0
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.

Viewing all articles
Browse latest Browse all 12

Trending Articles