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 日以上ある場合は、グループに参加したいと思います。

Webサービスで使用する方が簡単なので、これをlinq to sqlで実行したいと思いますが、単純な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 に答える