-1

各曜日 (SUNDAY、MONDAY、TUESDAY ... など) の bool 型の列があり、STARTDATE 列と ENDDATE 列も含まれている CLASSTIMES というテーブルがあります。たとえば、2013 年 6 月 3 日の STARTDATE と 2013 年 6 月 26 日の ENDDATE で選択された MONDAY と WEDNESDAY を含む行があるとします。

私ができるようにしたいのは、選択した各日の列の StartDate と EndDate の間のすべての日付を含む CLASSCALENDAR というテーブルに一連の行を挿入する SPROC を作成することです。

たとえば、ユーザーが ClassTimes テーブルから月曜日と水曜日を選択した場合、次のように生成されます。

行の日付
1 2013-06-03
2 2013-06-10
3 2013-06-17
4 2013-06-24
5 2013-06-05
6 2013-06-12
7 2013-06-19
8 2013-06-26

私はこれを設定しようとしましたが、それは私の頭を少し超えています。どんな助けでも大歓迎です。

4

1 に答える 1

0

これは、あなたに役立つかもしれないSQLステートメントです。

SELECT course,
       Convert(varchar(25), course_date, 101) AS course_date
  FROM (SELECT course_no AS course,
               DATEADD(dd, rn-1, startdate) AS course_date,
               DATENAME(dw, DATEADD(dd, rn-1, startdate)) AS dow
          FROM (SELECT row_number() OVER (ORDER BY c1) AS rn
                  FROM dummy) sub1,
               classtimes
         WHERE rn <= (DATEDIFF(dd, startdate, enddate)+1)
       ) list_of_dates,
       (SELECT course_no,
               (CASE monday WHEN 1 THEN 'Monday' END) AS dow
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE tuesday WHEN 1 THEN 'Tuesday' END)
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE wednesday WHEN 1 THEN 'Wednesday' END)          
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE thursday WHEN 1 THEN 'Thursday' END)
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE friday WHEN 1 THEN 'Friday' END)
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE saturday WHEN 1 THEN 'Saturday' END)
          FROM classtimes
        UNION
        SELECT course_no,
               (CASE sunday WHEN 1 THEN 'Sunday' END)
          FROM classtimes
        ) class_days
 WHERE list_of_dates.dow = class_days.dow
   AND list_of_dates.course = class_days.course_no
 ORDER BY course_no,
          course_date

クエリを使用しました

SELECT course_no AS course,
       DATEADD(dd, rn-1, startdate) AS course_date,
       DATENAME(dw, DATEADD(dd, rn-1, startdate)) AS dow
  FROM (SELECT row_number() OVER (ORDER BY c1) AS rn
          FROM dummy) sub1,
       classtimes
 WHERE rn <= (DATEDIFF(dd, startdate, enddate)+1)

各コースの開始日から終了日までのすべての日付のリストを生成します。このクエリが正しく機能するためには、ダミーテーブルに少なくとも各コースの開始日と終了日の間の日数と同じ数の行が含まれている必要があります。したがって、この結果は、各コースの開始日から終了日までの日数と、その日付の曜日のリストです。

| COURSE | COURSE_DATE |       DOW |
------------------------------------
|   MATH |  06/03/2013 |    Monday |
|   MATH |  06/04/2013 |   Tuesday |
|   MATH |  06/05/2013 | Wednesday |
|   MATH |  06/06/2013 |  Thursday |
|   MATH |  06/07/2013 |    Friday |
.........
.........
|   MATH |  06/24/2013 |    Monday |
|   MATH |  06/25/2013 |   Tuesday |
|   MATH |  06/26/2013 | Wednesday |

次に、一連の UNION を使用して classtimes テーブルから曜日の列を取得し、クラスが開催される曜日を生成するサブクエリを作成します。次に、list_of_dates サブクエリと class_days サブクエリを結合して、クラスが開催される日付を取得します。

|  COURSE | COURSE_DATE |
-------------------------
|    MATH |  06/03/2013 |
|    MATH |  06/05/2013 |
|    MATH |  06/10/2013 |
|    MATH |  06/12/2013 |
|    MATH |  06/17/2013 |
|    MATH |  06/19/2013 |
|    MATH |  06/24/2013 |
|    MATH |  06/26/2013 |

classtimes テーブル (class_days サブクエリ) からクラスの曜日のリストを生成するより効率的でエレガントな方法があると確信していますが、思いつきませんでした。

于 2013-05-21T23:34:13.320 に答える