【问题标题】:Calculating maximum interval between different time at the same field MYSQL计算同一字段MYSQL不同时间之间的最大间隔
【发布时间】:2017-08-29 15:13:46
【问题描述】:

我想知道您是否可以给我一些想法来计算同一领域不同时间之间的最大间隔。

id, npm, nama_mahasiswa, jurusan, fecha_hora
 1, CABRAL, 24, , 2017-08-25 15:27:12    
 2, RUSSO, 6, , 2017-08-25 15:32:10   
 3, CABRAL, 59, , 2017-08-25 15:34:15    
 4, RUSSO, 54, , 2017-08-25 15:38:21    
 5, CABRAL, 28, , 2017-08-25 15:38:47    
 6, FERNANDEZ, 61, , 2017-08-25 15:39:03    
 7, DUARTE, 56, , 2017-08-25 15:40:02    
 8, DUARTE, 47, , 2017-08-25 15:40:29    
 9, RUSSO, 69, , 2017-08-25 15:43:17    
10, CABRAL, 31, , 2017-08-25 15:43:35    
11, FERNANDEZ, 15, , 2017-08-25 15:48:14

例如,对于每个“CABRAL”,我想知道第一到第二、第二到第三和第三到第四的不同时间。一旦我有了这个,我将采取最大间隔。

我会感谢任何帮助。

谢谢!

【问题讨论】:

    标签: mysql date datetime intervals calculated-columns


    【解决方案1】:

    例如:

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    , npm VARCHAR(20) NOT NULL
    , jurusan INT NOT NULL
    , fecha_hora DATETIME NOT NULL
    );
    
    INSERT INTO my_table VALUES
    ( 1, 'CABRAL'   , 24, '2017-08-25 15:27:12'),
    ( 2, 'RUSSO'    ,  6, '2017-08-25 15:32:10'),
    ( 3, 'CABRAL'   , 59, '2017-08-25 15:34:15'),
    ( 4, 'RUSSO'    , 54, '2017-08-25 15:38:21'),
    ( 5, 'CABRAL'   , 28, '2017-08-25 15:38:47'),
    ( 6, 'FERNANDEZ', 61, '2017-08-25 15:39:03'),
    ( 7, 'DUARTE'   , 56, '2017-08-25 15:40:02'),
    ( 8, 'DUARTE'   , 47, '2017-08-25 15:40:29'),
    ( 9, 'RUSSO'    , 69, '2017-08-25 15:43:17'),
    (10, 'CABRAL'   , 31, '2017-08-25 15:43:35'),
    (11, 'FERNANDEZ', 15, '2017-08-25 15:48:14');
    
    SELECT npm
         , MAX(diff) max_interval 
      FROM 
         ( SELECT x.*
                , TIMEDIFF(x.fecha_hora,MAX(y.fecha_hora)) diff 
             FROM my_table x 
             JOIN my_table y 
               ON y.npm = x.npm 
              AND y.fecha_hora < x.fecha_hora 
            GROUP  
               BY x.npm
                , x.fecha_hora
         ) a 
     GROUP 
        BY npm;
    +-----------+--------------+
    | npm       | max_interval |
    +-----------+--------------+
    | CABRAL    | 00:07:03     |
    | DUARTE    | 00:00:27     |
    | FERNANDEZ | 00:09:11     |
    | RUSSO     | 00:06:11     |
    +-----------+--------------+
    4 rows in set (0.00 sec)
    

    【讨论】:

    • OP 应该考虑使用LEFT JOIN 来处理那些npm 还没有配对来计算间隔的人。
    • 它适用于我,但使用 MIN 而不是 MAX!我在此处发布的记录适用于 max 但 fecha_hora 的记录太多,当我尝试应用 MAX 时不起作用!谢谢!
    • @JonathanRojas 好的,但这个评论相当荒谬!
    • 对不起,伙计!我错了!你是对的,我在做坏事。我在之后应用了两个条件: y.fecha_hora
    • 请注意,函数不能使用索引,因此您的解决方案不可避免地会减慢速度。当然,有时这是不可避免的。
    【解决方案2】:

    应该使用子查询。

    SELECT `id`,
           `npm`,
           (SELECT TIMESTAMPDIFF(SECOND, t1.`fecha_hora`, t2.`fecha_hora`) as `diff` 
            FROM table t2 
            ORDER BY `diff` DESC 
            LIMIT 1) as `max_interval` 
    FROM table t1
    

    我假设您的表名是“表”。

    TIMESTAMPDIFF的第一个参数定义是否以秒、分钟、小时等为单位输出差异。

    【讨论】:

    • 您需要在 t1 和 t2 之间建立连接
    【解决方案3】:

    假设您想遵循 ID 顺序,这可能会起作用:

    SELECT A.id, 
           A.fecha_hora, 
           TIMESTAMPDIFF(MINUTE,A.fecha_hora,B.fecha_hora) AS timediff 
    FROM Table A 
    INNER JOIN Table B 
       ON B.id = (A.id + 1) 
    ORDER BY A.id ASC
    

    【讨论】:

    • ` B ON B.id = (A.id + 1)` 将连接错误的行
    • 这个假设显然是错误的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多