无法获得 (mm:ss) 中持续时间的平均值

Having trouble getting the average for duration in (mm:ss)

谢谢所有协助的人。我的目标是获取员工聊天对话的持续时间,然后计算他们的年平均值。数据以 (mm:ss or 18:30) 格式的短文本形式插入数据库。我尝试过以多种不同的方式转换和解析数据,到目前为止,我已经查看了 SO.com 上的大量解释和解决方案,但没有按照我想要的方式工作。下面是我将数据带入表格的显示程序。我知道我本可以用更简单的方式完成此操作,但我对 VB.net 和一般编码还很陌生。

    Private Sub DisplayJanMetrics()
    'Open a connection to the database and then assign the values from the appropriate metric columns to the appropriate labels.
    Dim str As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\CoachingDB.accdb"
    Dim conn As New OleDbConnection(str)

    Try
        conn.Open()
        Dim sql As String = "SELECT Duration, CSAT, Away, Quality, Development FROM January WHERE Employee =" & "'" & cmbEmployee.SelectedItem.ToString & "'"
        Dim cmd As New OleDbCommand(sql, conn)
        Dim myReader As OleDbDataReader = cmd.ExecuteReader()

        While myReader.Read
            lblJanDuration.Text = myReader("Duration").ToString
            lblJanCSAT.Text = myReader("CSAT").ToString
            lblJanAway.Text = myReader("Away").ToString
            lblJanQual.Text = myReader("Quality").ToString
            lblJanDev.Text = myReader("Development").ToString
        End While

    Catch ex As OleDbException
        MsgBox(ex.ToString)
    Finally
        conn.Close()
    End Try
End Sub

将数据加载到正确的标签后,我有一个按钮和单击事件来计算标签的平均值 - 其他我能够轻松完成的,因为我可以将它们解析为双打,然后执行从那里计算。这是表格的图片,我认为它会帮助你们所有人了解我正在努力完成的事情。

This is what the form layout looks like

最好将用户界面代码与数据库代码分开。通过将月份作为 TableName.

传递,您可以对任何月份使用相同的数据检索功能

数据库对象 Connection、Command 和 DataReader 都需要被释放和关闭,因此它们被放置在 Using 块中。您不想在更新用户界面时保持连接打开。只需 return 一个 DataTable 并用它更新 UI。

CalculateAverage 首先创建一个要包含在平均值中的标签数组。您可以包括所有 12 个,但平均值不会包括空标签。 (IsNullOrEmpty)

将字符串分隔成分和秒。获取总秒数并添加到列表中。

通过在 List(Of Integer 上调用 Average 获得平均秒数。

最后将平均秒数转回分秒数,格式化成字符串显示。

Private Sub DisplayJanMetrics()
    Dim dt As DataTable
    Try
        dt = GetEmployeeData(cmbEmployee.SelectedItem.ToString, "January")
    Catch ex As Exception
        MsgBox(ex.Message)
        Exit Sub
    End Try
    If dt.Rows.Count > 0 Then
        lblJanDuration.Text = dt(0)("Duration").ToString
        lblJanCSAT.Text = dt(0)("CSAT").ToString
        lblJanAway.Text = dt(0)("Away").ToString
        lblJanQual.Text = dt(0)("Quality").ToString
        lblJanDev.Text = dt(0)("Development").ToString
    End If
End Sub

Private Function GetEmployeeData(Employee As String, TableName As String) As DataTable
    Dim str As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\CoachingDB.accdb"
    Dim sql As String = $"SELECT Duration, CSAT, Away, Quality, Development FROM {TableName} WHERE Employee = @Employee;"
    Dim dt As New DataTable
    Using conn As New OleDbConnection(str),
            cmd As New OleDbCommand(sql, conn)
        cmd.Parameters.Add("@Employee", OleDbType.VarChar).Value = Employee
        conn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    Return dt
End Function

Private Function CalculateAverage() As String
    Dim lst As New List(Of Integer)
    Dim labels() = {Label1, Label2, Label3, Label4} 'an array of 1 thru 12
    For Each label In labels
        If Not String.IsNullOrEmpty(label.Text) Then
            Dim fields = label.Text.Split(":"c)
            Dim mins = CInt(fields(0))
            Dim secs = CInt(fields(1))
            lst.Add(mins * 60 + secs)
        End If
    Next
    Dim avg = lst.Average
    Dim avgMins = Math.Truncate(avg / 60)
    Dim remainderSec = avg - avgMins * 60
    Return $"{avgMins}:{remainderSec}"
End Function