0

これは、単純なビジュアル ベーシック Windows フォーム アプリケーションです。データベースは、ローカルの sqlserver データベースです。

タスクは、ID、dateTime、onOff、param の 4 つの列を持つテーブルを通過することです。

ID は特定のデバイスに固有です。dateTime はイベントが発生したときのタイムスタンプです。onOff は文字列「on」または「off」のいずれかで、param は整数で一意ではありません。

各 ID について、最初の行が ID 23 で "on" で param が 6 であるとします。その ID が 23 で param が 6 の一致する "off" 行を見つけ、dateTime の差を計算して、 ID がオンまたはオフであった期間。

これは、テーブル内のすべての ID (約 1,000 万行) に対して行う必要があります。各 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 に答える