1

我有一个 MySQL 查询,它为我的车辆跟踪“进出”时间生成一个表。

问题是“进入”时间与“退出”时间不同,因此在两者之间会丢失几秒钟或几分钟。

有没有办法将“输入”时间设置为等于前一行的“输出时间”,即使我需要将当前选择嵌入到新选择中?

您将在下图中看到第一行的出时间是15:45:14,下一行的入时间是15:46:14。所以在这种情况下,一分钟是lost

实际上,如果车辆离开了一个点,它会立即在通往下一个点的路上,所以我可以将时间设置为与前一行的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

time 中的第一行可以保持原样,outtime 的最后一行可以保持不变。我只需要考虑最小时间和最大时间之间的每一秒。

一如既往地感谢任何帮助。

提前致谢

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

如果您想插入一条新记录,但需要查找特定时间的上一个 in-time(即,如果您需要插入一条新记录,其入/出时间最近时间- 例如,插入一条以前以某种方式丢失的记录,并且此后添加了较新的时间条目)。如果您需要这种情况,请告诉我,如果您无法从上面解决,我会详细说明。

联接基本上将表“返回到自身”以提供另一个“副本”,但将“副本”中的结果限制为仅主表中当前车辆的那些行,并从车辆所在的副本中排除这些行out-time 比主表中的当前 in-time 更近。这样,您可以对副本执行 MAX() 以查找先前的退出时间。

我不知道您的具体要求,但我建议您尽可能存储最准确的信息。因此,如果“综合”一个值只是为了在一些报告上进行修饰,我会不理会数据,并整理报告,而不是丢失可能在跟踪中派上用场的数据。例如,如果将来您突然需要告诉您的老板“我们的车辆‘停放’并闲置多长时间?”会发生什么?

但是,如果您只想插入一条忽略实际超时时间的新记录,并将其替换为最新记录的在时时间,那么以下查询将为您找到该值:

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

from 
 vehicle_times vt

group by 
 vt.vehicle

我错过了你的要求吗?

于 2013-03-25T09:25:07.413 回答