1

車両追跡の「イン」時間と「アウト」時間のテーブルを生成するMySQLクエリがあります。

問題は、「入力」時間が「出力」時間と同じではないため、その間に秒または分が失われることです。

現在のselectを新しいselect内に埋め込む必要がある場合でも、「in」時間を前の行の「outtime」と等しく設定する方法はありますか?

15:45:14下の画像で、最初の行のアウト時間がであり、次の行のインタイムがであることがわかります15:46:14。したがって、この場合、1分はlost

実際には、車両が1つのポイントを離れた場合、それはすぐに次のポイントへの道を進んでいるので、前の列inの時間と同じ時間を設定できます。outこのように、時間は決してありませんlost

ここに画像の説明を入力してください

私のクエリのSQLは次のとおりです。

select vehicle,InTime,OutTime from (select
      PreQuery.callingname as vehicle,
      PreQuery.geofence,
      PreQuery.GroupSeq,
      MIN( PreQuery.`updatetime` ) as InTime,
       UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`))as InSeconds,
      MAX( PreQuery.`updatetime` ) as OutTime,
      UNIX_TIMESTAMP(MAX( PreQuery.`updatetime`))as OutSeconds,
      TIME_FORMAT(SEC_TO_TIME((UNIX_TIMESTAMP(MAX( PreQuery.`updatetime` )) - UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`)))),'%H:%i:%s') as Duration,
      (UNIX_TIMESTAMP(MAX( PreQuery.`updatetime` )) - UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`))) as DurationSeconds
   from
     ( select
              v_starting.callingname,
              v_starting.geofence,
              v_starting.`updatetime`,
              @lastGroup := @lastGroup + if( @lastAddress = v_starting.geofence 
                                         AND @lastVehicle = v_starting.callingname, 0, 1 ) as GroupSeq,
              @lastVehicle := v_starting.callingname as justVarVehicleChange,
              @lastAddress := v_starting.geofence as justVarAddressChange
           from
              v_starting,
              ( select @lastVehicle := '',
                       @lastAddress := '',
                       @lastGroup := 0 ) SQLVars
           order by
              v_starting.`updatetime` ) PreQuery
   Group By
      PreQuery.callingname,
      PreQuery.geofence,

      PreQuery.GroupSeq)  parent

      where (InTime>  DATE_SUB('2013-03-23 15:00', INTERVAL 24 HOUR) or OutTime> '2013-03-23 15:00' ) and vehicle='TT08' order by InTime asc

MySQLの構文は非常に詳細ですが、はるかに単純なクエリでも実行できます。お気に入り

select vehicle, intime,outtime from vehicletimes

私の希望する結果は次のようなものです。

select vehicle, intime(outtime of row above),outtime from vehicletimes

時間の最初の行はそのままにすることができ、最後の行のアウトタイムはそのままにすることができます。最小の時間と最大の時間の間の毎秒を考慮する必要があります。

いつものように助けていただければ幸いです。

前もって感謝します

4

1 に答える 1

1

これにより、既存のレコードについて、現在の各アウトタイムより前の最新のインタイムが得られると思います。

select
 vt.vehicle, max(qGetMaxOut.outtime) as intime , vt.outtime

from 
 vehicle_times vt

 inner join 
 (
    select vehicle, outtime
    from vehicle_times 

 ) qGetMaxOut
 on qGetMaxOut.vehicle = vt.vehicle 
 and qGetMaxOut.outtime <= vt.intime 

group by
 vt.vehicle, vt.outtime

上記のクエリは、新しいレコードを挿入したいが、特定の時間の前のインタイムを見つける必要がある場合にも役立ちます(つまり、イン/アウト時間が最新の時間より前の新しいレコードを挿入する必要がある場合) -たとえば、以前は何らかの理由で見逃されていたレコードを挿入し、それ以降、新しい時間エントリが追加された場合)。このシナリオが必要な場合は、お知らせください。上記で解決できない場合は、詳しく説明します。

結合は基本的にテーブルを「それ自体に戻って」結合して別の「コピー」を提供しますが、「コピー」の結果をメインテーブルの現在の車両の行のみに制限し、車両のコピーからそれらの行を除外しますアウトタイムは、メインテーブルからの現在のインタイムよりも新しいものです。このようにして、コピーに対してMAX()を実行して、前回のアウトタイムを確認できます。

具体的な要件はわかりませんが、できる限り正確な情報を保存することをお勧めします。したがって、値を「合成」することがいくつかのレポートの見た目の目的である場合は、データをそのままにして、将来的に役立つ可能性のあるデータを失うのではなく、レポートを整理します。たとえば、将来、突然上司に「私たちの車はどれくらいの時間「車に乗って」アイドル状態になっているのか」と伝える必要が生じた場合はどうなりますか。

ただし、実際のアウトタイムを無視して新しいレコードを挿入し、最新のレコードのインタイムに置き換えたい場合は、次のクエリでその値が見つかります。

select
 vt.vehicle, max(vt.outtime) as intime

from 
 vehicle_times vt

group by 
 vt.vehicle

私はあなたの要件を逃しましたか?

于 2013-03-25T09:25:07.413 に答える