0

我有一个简单的 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 to sql 来完成这项工作,因为我在 web 服务中使用它会更简单,但简单的 sql 就可以了:)

4

1 回答 1

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  

但是欢迎任何评论和优化:)

于 2012-06-20T12:58:50.980 回答