2012-06-20 63 views
0

我有一個簡單的SQL查詢,像這樣:LINQ to 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天以上,到另一個我是一個想加入他們的小組。

,我想這與LINQ做SQL作爲它會更簡單,我在web服務使用,但簡單的SQL就可以了:)

+0

已經嘗試過什麼? – bluevector

+0

現在我正在使用第一部分,但我已經嘗試構建遞歸查詢,但我已經殺死了我的服務器進行連接,其中endDate + 1 = startDate:/ – Misiu

+0

您可以向我們展示LINQ to SQL查詢已經寫了? – bluevector

回答

0

得到了這樣的事情:

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