0

这是一个简单的 Visual Basic Windows 窗体应用程序。数据库是本地 sqlserver 数据库。

任务是遍历一个有 4 列的表:ID、dateTime、onOff、param。

ID 对于特定设备是唯一的,dateTime 是事件发生时间的时间戳,onOff 将是字符串“on”或“off”,param 是整数,不是唯一的。

对于每个 ID,假设第一行是 ID 23,它是“on”,param 是 6,我需要为 ID 23 和 param 6 找到匹配的“off”行,并计算 dateTime 的差异以确定一个ID 开启或关闭的持续时间。

这需要对表中的所有 ID 进行,大约 1000 万行。每个 ID 有多个开/关对,关键是找到与 dateTime 最接近的一对。

我已经查看并尝试了几种方法都无济于事,从数据表和数据集到将所有内容推送到 csv 并一次以块的形式读取。解决此问题的最佳方法是什么,您的步骤是什么?

在下面的代码中,一旦用户选择了开始和结束日期,正确的数据就会放在数据表中。现在我需要执行上述匹配行的任务。

Dim sConnectionString As String
    sConnectionString = "Data Source=[servername];Initial Catalog=[tabelname];Integrated Security=True"

    Dim objConn As New SqlConnection(sConnectionString)
    objConn.Open()

    Dim ID As String
    ID = TextBox1.Text

    Dim startDate As Date
    startDate = DateTimePicker1.Value.Date

    Dim endDate As Date
    endDate = DateTimePicker2.Value.Date

    Dim strSql As String = "SELECT ID, dateTime, onOff, param FROM signalRaw WHERE CAST (dateTime as DATE) between '" & startDate & "' AND '" & endDate & "'"

    Dim dasignalRawComma As New SqlDataAdapter(strSql, objConn)

    Dim dtb As New DataTable
    dasignalRawComma.Fill(dtb)
4

1 回答 1

1

在 SQL 中完成所有操作并读取结果:

SELECT  ID, 
        dateTime, 
        onOff, 
        param, 
        (
            SELECT TOP 1 dateTime 
            FROM signalRaw 
            WHERE id = sr.id 
                AND param = sr.param 
                AND onOff = 'OFF'
                AND CAST (dateTime as DATE)>= '1/1/11'
                AND CAST (dateTime as DATE) >= CAST (sr.dateTime as DATE)
            ORDER BY dateTime


        ) OffTime 
FROM signalRaw sr 
WHERE CAST (dateTime as DATE) between '1/1/11' AND '2/1/11' 
    AND onoff = 'ON'

顺便说一句...请将日期存储为日期。铸造是痛苦的。

于 2013-06-20T19:48:51.360 回答