使用 VBScript 循环遍历 SQL 数据库并对相似时间进行分组

Looping through SQL database using VBScript and grouping similar times

我需要遍历 SQL 服务器数据表并显示每条记录的一些信息。但是,我需要按每个 "event" 的相同开始时间对其进行分组。我想在一个循环命令中执行此操作,而不是每次都使用单独的循环命令。我知道这可能是我想念的简单事情。但我想不通。我想按开始时间对这些事件进行分组。我希望每个开始时间都有一个 H4 header 并显示该开始时间的所有事件,然后也使用 H4 标签移动到下一个开始时间。但是每组开始时间只有一个H4标签。这是我的代码:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open  

strSQL = "SELECT EventTitle, FinalStartTime, FinalEndTime, Organization, description FROM  Meetings WHERE   ApprovalStatus = 'Approved' ORDER BY FinalStartTime"

            Set rstDisplay = Conn.Execute(strSQL)

            i=0

            While Not rstDisplay.EOF  

            i=i+1

            strSecondStartTime = strStartTime

            strStartTime = rstDisplay("FinalStartTime")
            strEndTime = rstDisplay("FinalEndTime")





%>                  

            <h4><%=strStartTime%>&ndash;<%=strEndTime%></h4>

            <table class="prog-table" id="report<%=i%>">
          <tr>
            <td class="firsttd"><%=rstDisplay("EventTitle")%><span style="float:right; opacity:0.5; display:block; padding-left:50px;"><i class="fa fa-plus" aria-hidden="true"></i></span></td>
          </tr>

          <tr>
            <td> 
      <p><strong>Presented by:</strong><BR>
      <blockquote><%=rstDisplay("Organization")%></blockquote></p>


      <p><%=rstDisplay("description")%></p>




      </td>
          </tr>
          </table>      


<%                  
            rstDisplay.MoveNext
            Wend

            rstDisplay.Close
            Conn.Close
%>

结果 HTML 应该是简化的:

9:00 上午 - 10:00 上午
事件 1
事件 2

上午 11:00 - 12:00 下午
事件 3
事件 4

下午 1:00 - 2:00 下午
事件 5

下午 3:00 - 4:00 下午
活动 6
事件 7
活动 8


目前我的结果 HTML 不正确,显示如下:

9:00 上午 - 10:00 上午
事件 1
9:00 上午 - 10:00 上午
事件 2
9:00 上午 - 10:00 上午
事件 3

等等等等

我会尝试让 SQL 语句本身进行分组,然后迭代结果行以更轻松地注入 HTML。像这样:

SELECT
    CAST(M.FinalStartTime as varchar(50)) + ' - ' + CAST(M.FinalEndTime as varchar(50))
    , 
    REPLACE(
    REPLACE(
    REPLACE(

        (SELECT IM.EventTitle FROM Meetings IM WHERE IM.FinalStartTime = M.FinalStartTime AND IM.FinalEndTime = M.FinalEndTime AND IM.ApprovalStatus = 'Approved'  For XML PATH (''))
            , '</EventTitle><EventTitle>', ',')
            , '<EventTitle>','')
            , '</EventTitle>','')
FROM
    Meetings M
WHERE  
    M.ApprovalStatus = 'Approved'
GROUP BY
    M.FinalStartTime, M.FinalEndTime,  CAST(M.FinalStartTime as varchar(50)) + ' - ' + CAST(M.FinalEndTime as varchar(50))
ORDER BY
    M.FinalStartTime

这个 SQL 超出了我的想象,没有针对性能进行优化,但它可能会让您更轻松。只需用这个 SQL 替换你的 strSQL =。

只需跟踪您所在的组,并且仅在更改时显示 <h4>

G = ""
i = 0
Do Until rs.EOF
    strStartTime = rs("FinalStartTime")
    strEndTime = rs("FinalEndTime")
    If G <> strStartTime & "&ndash;" & strEndTime Then
        G = strStartTime & "&ndash;" & strEndTime
        Response.Write "<h4>" & G & "</h4>"
    End If
    i = i + 1
    %>
    <table class="prog-table">(etc.)</table>
    <%
    rs.Movenext
Loop

(当然,这假设您的记录集按 header 字段排序 - 在您的例子中,开始时间和结束时间。)