jjzjj

mysql - 找出两个记录之间的时间

coder 2023-10-15 原文

所以这是我有一个表的场景,它记录来自设备的 gps 数据以及引擎状态(打开或关闭)。我需要找出引擎状态开启和关闭的时间。

vehicle_id | engine_status | time_stamp
 1         |    on         |2014-05-21 07:30:02
 2         |    off        |2014-05-21 07:40:02
 1         |    on         |2014-05-21 07:50:02
 1         |    on         |2014-05-21 08:00:02
 1         |    on         |2014-05-21 08:10:02
 2         |    on         |2014-05-21 08:20:02
 1         |    off        |2014-05-21 08:30:02
 1         |    off        |2014-05-21 08:40:02
 2         |    on         |2014-05-21 08:50:02
 1         |    off        |2014-05-21 09:00:02
 2         |    on         |2014-05-21 09:10:02
 1         |    off        |2014-05-21 09:10:06
 1         |    off        |2014-05-21 09:30:02
 2         |    on         |2014-05-21 09:30:02
 1         |    off        |2014-05-21 09:35:02
 2         |    on         |2014-05-21 09:39:02
 1         |    off        |2014-05-21 09:40:02
 1         |    off        |2014-05-21 09:45:02
 2         |    off        |2014-05-21 09:50:02
 1         |    on         |2014-05-21 09:55:02
 1         |    on         |2014-05-21 09:56:02
 2         |    off        |2014-05-21 09:58:02
 1         |    on         |2014-05-21 09:59:02
 1         |    on         |2014-05-21 09:59:02
 1         |    on         |2014-05-21 10:10:02
 2         |    off        |2014-05-21 09:30:02

最佳答案

考虑以下...

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (vehicle_id INT NOT NULL
 ,engine_status VARCHAR(12) NOT NULL
 ,time_stamp TIMESTAMP NOT NULL
 );

 INSERT INTO my_table VALUES
 (1,'on'         ,'2014-05-21 07:30:02'),
 (2,'off'        ,'2014-05-21 07:40:02'),
 (1,'on'         ,'2014-05-21 07:50:02'),
 (1,'on'         ,'2014-05-21 08:00:02'),
 (1,'on'         ,'2014-05-21 08:10:02'),
 (2,'on'         ,'2014-05-21 08:20:02'),
 (1,'off'        ,'2014-05-21 08:30:02'),
 (1,'off'        ,'2014-05-21 08:40:02'),
 (2,'on'         ,'2014-05-21 08:50:02'),
 (1,'off'        ,'2014-05-21 09:00:02'),
 (2,'on'         ,'2014-05-21 09:10:02'),
 (1,'off'        ,'2014-05-21 09:10:06'),
 (1,'off'        ,'2014-05-21 09:30:02'),
 (2,'on'         ,'2014-05-21 09:30:02'),
 (1,'off'        ,'2014-05-21 09:35:02'),
 (2,'on'         ,'2014-05-21 09:39:02'),
 (1,'off'        ,'2014-05-21 09:40:02'),
 (1,'off'        ,'2014-05-21 09:45:02'),
 (2,'off'        ,'2014-05-21 09:50:02'),
 (1,'on'         ,'2014-05-21 09:55:02'),
 (1,'on'         ,'2014-05-21 09:56:02'),
 (2,'off'        ,'2014-05-21 09:58:02'),
 (1,'on'         ,'2014-05-21 09:59:02'),
 (1,'on'         ,'2014-05-21 09:59:02'),
 (1,'on'         ,'2014-05-21 10:10:02'),
 (2,'off'        ,'2014-05-21 09:30:02');

 SELECT vehicle_id
      , engine_status
      , SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(end,start)))) total
   FROM
      (
 SELECT a.vehicle_id
      , a.engine_status
      , a.time_stamp start
      , MIN(c.time_stamp) end 
   FROM 
      ( SELECT *
             , CASE WHEN @prev= vehicle_id THEN @i:=@i+1 ELSE @i:=1 END rank
             , @prev:=vehicle_id 
          FROM my_table
             , ( SELECT @i:=1,@prev:='')x 
         ORDER 
            BY vehicle_id
             , time_stamp
      ) a
   LEFT 
   JOIN 
      ( SELECT *
             , CASE WHEN @prev= vehicle_id THEN @i:=@i+1 ELSE @i:=1 END rank
             , @prev:=vehicle_id 
          FROM my_table
             , ( SELECT @i:=1,@prev:='')x 
         ORDER 
            BY vehicle_id
             , time_stamp
      ) b  
     ON b.vehicle_id = a.vehicle_id 
    AND b.engine_status = a.engine_status
    AND b.rank = a.rank - 1  
   LEFT 
   JOIN 
      ( SELECT *
             , CASE WHEN @prev= vehicle_id THEN @i:=@i+1 ELSE @i:=1 END rank
             , @prev:=vehicle_id 
          FROM my_table
             , ( SELECT @i:=1,@prev:='')x 
         ORDER 
            BY vehicle_id
             , time_stamp
      ) c 
     ON c.vehicle_id = a.vehicle_id
    AND c.engine_status = a.engine_status
    AND c.rank >= a.rank 
   LEFT 
   JOIN 
      ( SELECT *
             , CASE WHEN @prev= vehicle_id THEN @i:=@i+1 ELSE @i:=1 END rank
             , @prev:=vehicle_id 
          FROM my_table
             , ( SELECT @i:=1,@prev:='')x 
         ORDER 
            BY vehicle_id
             , time_stamp
      ) d 
     ON d.vehicle_id = c.vehicle_id  
    AND d.engine_status = c.engine_status
    AND d.rank = c.rank + 1 
  WHERE b.rank IS NULL 
    AND c.rank IS NOT NULL
    AND d.rank IS NULL
  GROUP 
     BY a.vehicle_id
      , a.engine_status
      , a.rank
      ) x
   GROUP BY vehicle_id, engine_status;
+------------+---------------+----------+
| vehicle_id | engine_status | total    |
+------------+---------------+----------+
|          1 | off           | 01:15:00 |
|          1 | on            | 00:55:00 |
|          2 | off           | 00:08:00 |
|          2 | on            | 01:10:00 |
+------------+---------------+----------+

关于mysql - 找出两个记录之间的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23777887/

有关mysql - 找出两个记录之间的时间的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  4. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  5. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  6. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  7. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  8. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  9. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  10. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

随机推荐