根据日期和持续时间数据计算时间列 - SQL 服务器 ASP 经典

Calculate Time column from Date and Duration data - SQL Server ASP Classic

我一直在寻找类似的案例,但找不到符合我的案例。

我在 TestDB 中有 2 个 tables: Activity table with StartDate column, and a child table ActivityLog table带有 Duration 列数据。

Create Table Activity (
ActivityID int Not Null,
StartDate Date,
Summary varchar(255),
Primary Key (ActivityID)
);

Create Table ActivityLog (
ActivityID int Foreign Key References Activity(ActivityID),
LogID int Not Null Primary Key,
Duration int Not Null,
Comment varchar(255) Not Null
);

我写ASP经典生成一个Table。我的代码如下:

<%
        'Set Variable
        Dim objCN 'ADO Connection Object
        Dim objRS 'ADO Recordset Object

        'Create a Connection Object
        Set objCN = Server.CreateObject("ADODB.Connection")

        'Connect to SQL Server Database, connection string in Global.asa file                      
        objCN.Open Application("ConnStrTestDB")

        'SQL Query for select Person Name
         strSQLAct="SELECT a.StartDate, al.Duration, al.Comment FROM Activity AS a INNER JOIN ActivityLog AS al ON a.ActivityID = al.ActivityID"

         'Create Recordset
         Set objRS = Server.CreateObject("ADODB.Recordset")
         objRS.Open strSQLAct, objCN
    %>

    <table>
        <thead class="thead-light">
            <tr>
                <th>Start Time</th>
                <th>Duration (hours)</th>            
                <th>End Time</th>
                <th>Comment</th>
            </tr>
        </thead>
        <tbody>
            <% Do While Not objRS.EOF %>
                <tr>
                    <td><%Response.Write(objRS("StartDate"))%></td>                                
                    <td><%Response.Write(objRS("Duration"))%></td>                                        
                    <td><%Response.Write(objRS("StartDate"))%></td>
                    <td><%Response.Write(objRS("Comment"))%></td>
                  </tr>
             <%
                objRS.MoveNext
                Loop
             %>
        </tbody>
    </table>
    <!--Close Recordset-->
    <%
        objRS.Close
        Set objRS = Nothing
    %>

我想在结果中添加开始时间和结束时间列 Table。开始时间根据 a.StartDate 数据计算,使用时间值。结束时间是开始时间 + 持续时间。持续时间以小时为单位。

我真的很感激你知道如何实现它。

谢谢

我遵循@Aleksei Lychev 的回答,我在SQL Management Studio 中测试了查询,它运行 给出了完美的结果。然后我更新了我的 ASP Classic 如下:

<%
        'Set Variable
        Dim objCN 'ADO Connection Object
        Dim objRS 'ADO Recordset Object

        'Create a Connection Object
        Set objCN = Server.CreateObject("ADODB.Connection")

        'Connect to SQL Server Database, connection string in Global.asa file                      
        objCN.Open Application("ConnStrTestDB")

        'SQL Query for select Person Name
         strSQLAct = "SELECT a.StartDate, a.Summary, al.Duration, al.Comment " + _
                     "DATEADD(hh, (SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE UNBOUNDED PRECEDING) - SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE CURRENT ROW)), CONVERT(SMALLDATETIME, a.StartDate)) AS StartTime " + _
                     "DATEADD(hh, SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE UNBOUNDED PRECEDING), CONVERT(SMALLDATETIME, a.StartDate)) AS EndTime " + _
                     "FROM Activity AS a " + _
                     "INNER JOIN ActivityLog AS al ON al.ActivityID = a.ActivityID " + _
                     "ORDER BY a.ActivityID, al.LogID;"

         'Create Recordset
         Set objRS = Server.CreateObject("ADODB.Recordset")
         objRS.Open strSQLAct, objCN
    %>

    <table>
        <thead class="thead-light">
            <tr>
                <th>Start Time</th>
                <th>Duration (hours)</th>            
                <th>End Time</th>
                <th>Comment</th>
            </tr>
        </thead>
        <tbody>
            <% Do While Not objRS.EOF %>
                <tr>
                    <td><%Response.Write(objRS("StartTime"))%></td>                                
                    <td><%Response.Write(objRS("EndTime"))%></td>                                        
                    <td><%Response.Write(objRS("Duration"))%></td>
                    <td><%Response.Write(objRS("Comment"))%></td>
                  </tr>
             <%
                objRS.MoveNext
                Loop
             %>
        </tbody>
    </table>
    <!--Close Recordset-->
    <%
        objRS.Close
        Set objRS = Nothing
    %>

出现以下错误:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'hh'.
 /TestDBTimeLog.asp, line 30 

我试过Google,但我还没有找到导致问题的原因。

超出我的想象,假设 Activity一个 Activity 中的日志按 LogID 排序并且 "sql-server" 标签是正确的:

SELECT
    a.StartDate,
    a.Summary,
    al.Duration,
    al.Comment,
    DATEADD(hh,
        SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE UNBOUNDED PRECEDING) - SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE CURRENT ROW),
        CONVERT(SMALLDATETIME, a.StartDate)) AS StartTime,
    DATEADD(hh,
        SUM(al.Duration) OVER (PARTITION BY a.ActivityID ORDER BY al.LogID RANGE UNBOUNDED PRECEDING),
        CONVERT(SMALLDATETIME, a.StartDate)) AS EndTime
FROM Activity AS a
INNER JOIN ActivityLog AS al
    ON al.ActivityID = a.ActivityID
ORDER BY a.ActivityID, al.LogID

我不太擅长 window 函数,这肯定可以做得更好,但我希望你有一个想法。