无法获得 (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
谢谢所有协助的人。我的目标是获取员工聊天对话的持续时间,然后计算他们的年平均值。数据以 (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