如何在SQL表中创建一系列特定的日期?

如何在SQL表中创建一系列特定的日期?,sql,Sql,我有一个名为CLASSTIMES的表,它有一个bool类型的列,用于一周中的每一天(星期日、星期一、星期二等等),还包含一个STARTDATE和一个ENDDATE列。例如,我将有一行选择了星期一和星期三,开始日期为2013年6月3日,结束日期为2013年6月26日 我希望能够创建一个存储过程,将一系列行插入名为CLASSCALENDAR的表中,该表包含每个选定日期列的StartDate和EndDate之间的所有日期 例如,如果用户从ClassTimes表中选择了星期一和星期三,它将生成: Row

我有一个名为CLASSTIMES的表,它有一个bool类型的列,用于一周中的每一天(星期日、星期一、星期二等等),还包含一个STARTDATE和一个ENDDATE列。例如,我将有一行选择了星期一和星期三,开始日期为2013年6月3日,结束日期为2013年6月26日

我希望能够创建一个存储过程,将一系列行插入名为CLASSCALENDAR的表中,该表包含每个选定日期列的StartDate和EndDate之间的所有日期

例如,如果用户从ClassTimes表中选择了星期一和星期三,它将生成:

Row Date 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 行日期 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
我已经试着设置了这个,但有点过头了。任何帮助都将不胜感激。

这里有一条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
然后,我有一个子查询,它使用一系列的联合从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子查询)中为类生成一周中的天数列表,但我想不出一种方法

您使用的是哪种数据库管理系统?博士后?Oracle?我建议您从一个日历表开始,然后针对任何给定的请求加入它。不要为每个用户/请求重新创建它。您好,我使用的是MS SQL 2012。抱歉,我对参与堆栈溢出有点陌生。我不知道你这么快就回答了我的问题。如果您下面的示例在MSSQL中有效,我将尝试一下并让您知道这一点。感谢您的快速回复。戈登,您是否建议我创建一个预先填充日期(例如未来10年)的日历表,然后将该表作为我所做一切的参考?
| 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 |
|  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 |