2012-06-20 2 views
0

У меня есть простой SQL-запрос так:LINQ к SQL объединить даты в группы

SELECT dt AS 'startDate' 
, dt AS 'endDate' 
FROM 
    WorkCalendar 
WHERE 
    dt BETWEEN dateadd(yy, datediff(yy, 0, getdate()), 0) AND dateadd(MILLISECOND, -3, dateadd(YEAR, datediff(YEAR, 0, getdate()) + 1, 0)) 
    AND isWorkDay = 0 

Это возвращает все даты из моей таблицы, содержащие дни освобождения от работы в текущем году.

Это пример вывода:

startDate    endDate 
2012-01-01 00:00:00  2012-01-01 00:00:00 
2012-01-06 00:00:00  2012-01-06 00:00:00 
2012-01-07 00:00:00  2012-01-07 00:00:00 
2012-01-08 00:00:00  2012-01-08 00:00:00 
2012-01-14 00:00:00  2012-01-14 00:00:00 
2012-01-15 00:00:00  2012-01-15 00:00:00 
2012-01-21 00:00:00  2012-01-21 00:00:00 
2012-01-22 00:00:00  2012-01-22 00:00:00 

То, что я хотел бы сделать, это группа около дат, как так:

startDate    endDate 
2012-01-01 00:00:00  2012-01-01 00:00:00 
2012-01-06 00:00:00  2012-01-08 00:00:00 
2012-01-14 00:00:00  2012-01-15 00:00:00 
2012-01-21 00:00:00  2012-01-22 00:00:00 

Если у меня есть 2 или более дней, которые один за другим I хотели бы присоединиться к ним в группы.

Я хотел бы это сделать с помощью LINQ к SQL, как это будет проще для меня, чтобы использовать в веб-сервиса, но простой SQL будет делать трюк :)

+0

Что уже пробовали? – bluevector

+0

Сейчас я использую первую часть, но я попытался построить рекурсивный запрос, но я убил мой сервер, делающий объединения, где endDate + 1 = startDate:/ – Misiu

+0

Не могли бы вы показать нам запрос LINQ to SQL Вы уже писали? – bluevector

ответ

0

Got что-то вроде этого:

WITH d (d1) 
AS (SELECT dt 
    FROM workcalendar 
    WHERE dt BETWEEN Dateadd(yy, Datediff(yy, 0, Getdate()), 0) AND 
           Dateadd(millisecond, -3, 
           Dateadd(year, Datediff(year, 
              0, 
              Getdate()) + 1 
           , 0)) 
      AND isworkday = 0) 
SELECT Z1.d1 AS startDate, 
    Z2.d1 AS endDate 
FROM (SELECT Row_number() 
      OVER ( 
       ORDER BY A.d1) AS 'ID', 
      A.d1 
    FROM d AS A 
    WHERE NOT EXISTS (SELECT * 
         FROM d AS C 
         WHERE A.d1 = Dateadd(d, 1, C.d1))) AS Z1, 
    (SELECT Row_number() 
      OVER ( 
       ORDER BY A.d1) AS 'ID', 
      A.d1 
    FROM d AS A 
    WHERE NOT EXISTS (SELECT * 
         FROM d AS C 
         WHERE A.d1 = Dateadd(d, -1, C.d1))) AS Z2 
WHERE Z1.id = Z2.id 

Но любые комментарии и оптимизация приветствуются :)

+0

Я думал, что вы ищете LINQ to SQL, чтобы выразить это? – bluevector

+0

Да, но я не знаю, как это сделать: / – Misiu

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