首页 > 解决方案 > 如何使用 vb.net 将多行的连续日期时间合并为单行

问题描述

我正在尝试将数据与连续的日期和时间相结合。我不知道该怎么做。

Dim dr As SqlDataReader = cmd.ExecuteReader()
Dim r As DataRow
Dim i As Int64 = 1

While dr.Read()
r = t.NewRow()
r(0) = i.ToString()
r(1) = Convert.ToDateTime(dat("fromtime")).ToString("yyyy/MM/dd HH:mm:ss")
r(2) = Convert.ToDateTime(dat("totime")).ToString("yyyy/MM/dd HH:mm:ss")
r(3) = dat("duration").ToString()
End While

我不知道你有没有得到我。我举个例子。

这是我得到的结果。


No      from               to                   Duration
1   2019/05/15 13:51:57 2019/05/15 13:52:14        17
2   2019/05/15 13:52:14 2019/05/15 13:52:38        24   
3   2019/05/15 13:52:38 2019/05/15 13:52:46        8    
4   2019/05/15 13:52:46 2019/05/15 13:53:40        54

5   2019/05/15 13:56:52 2019/05/15 13:57:46        54   
6   2019/05/15 18:56:53 2019/05/15 18:57:03        10


Numbers 1-4 have a consecutive date and time I want it to merge into a single row.

No      from               to                  Duration
1   2019/05/15 13:51:57 2019/05/15 13:53:40      103

2   2019/05/15 13:56:52 2019/05/15 13:57:46      54 
3   2019/05/15 18:56:53 2019/05/15 18:57:03      10

标签: vb.netado.net

解决方案


有趣的问题!我在一些数据表中重新创建了您的数据,并设法在控制台应用程序中创建了您的结果:

    Dim dst As New DataSet
    Dim tblRaw As DataTable = dst.Tables.Add("ttmpOld")
    tblRaw.Columns.Add("No")
    tblRaw.Columns.Add("from")
    tblRaw.Columns.Add("to")
    tblRaw.Columns.Add("Duration", GetType(Integer))
    With tblRaw.Rows
        .Add(1, "2019/05/15 13:51:57", "2019/05/15 13:52:14", 17)
        .Add(2, "2019/05/15 13:52:14", "2019/05/15 13:52:38", 24)
        .Add(3, "2019/05/15 13:52:38", "2019/05/15 13:52:46", 8)
        .Add(4, "2019/05/15 13:52:46", "2019/05/15 13:53:40", 54)
        .Add(5, "2019/05/15 13:56:52", "2019/05/15 13:57:46", 54)
        .Add(6, "2019/05/15 18:56:53", "2019/05/15 18:57:03", 10)
    End With
    Dim strFrom As String = ""
    Dim strFromStart As String = ""
    Dim strTo As String = ""
    Dim tblNew As DataTable = dst.Tables.Add("ttmpNew")
    tblNew.Columns.Add("No")
    tblNew.Columns.Add("from")
    tblNew.Columns.Add("to")
    tblNew.Columns.Add("Duration", GetType(Integer))
    Dim intNo As Integer = 0
    Dim intDuration As Integer = 0
    Dim intTotal As Integer = 0
    'Loop through and get your consecutive data but only create a new row when needed
    For Each objRow In tblRaw.Rows
        strFrom = objRow("from")
        intDuration = objRow("Duration")
        If strFrom <> strTo Then
            If strTo <> "" Then tblNew.Rows.Add(intNo, strFromStart, strTo, intTotal)
            intTotal = intDuration
            strFromStart = strFrom
            intNo = objRow("No")
        Else
            intTotal = intTotal + intDuration
        End If
        strTo = objRow("to")
    Next
    'Last row
    tblNew.Rows.Add(intNo, strFromStart, strTo, intTotal)
    For Each objRow In tblNew.Rows
        Console.WriteLine(objRow("No") & ", " & objRow("from") & ", " & objRow("to") & ", " & objRow("Duration"))
    Next
    Console.ReadKey()

祝您的解决方案好运!


推荐阅读