Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 计算MySQL查询期间的时间差_Php_Mysql_Datetime - Fatal编程技术网

Php 计算MySQL查询期间的时间差

Php 计算MySQL查询期间的时间差,php,mysql,datetime,Php,Mysql,Datetime,我有两个MySQL表,都包含DATETIME字段: 表beginings包含某个进程启动的时间 表events包含该进程导致某些事件的时间 开始是在晚上;事件发生在第二天早上。请注意,每个开头后面都有不断变化的多个事件 以下是两个示例表: CREATE TABLE IF NOT EXISTS `beginnings` ( `bid` int(10) unsigned NOT NULL AUTO_INCREMENT, `begin` datetime NOT NULL, PRIMARY

我有两个MySQL表,都包含DATETIME字段:

  • beginings
    包含某个进程启动的时间
  • events
    包含该进程导致某些事件的时间
  • 开始是在晚上;事件发生在第二天早上。请注意,每个开头后面都有不断变化的多个事件

    以下是两个示例表:

    CREATE TABLE IF NOT EXISTS `beginnings` (
      `bid` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `begin` datetime NOT NULL,
      PRIMARY KEY (`bid`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
    
    INSERT INTO `beginnings` (`bid`, `begin`) VALUES
    (1, '2014-09-24 22:44:00'),
    (2, '2014-09-25 21:32:00'),
    (3, '2014-09-28 22:01:00');
    
    CREATE TABLE IF NOT EXISTS `events` (
      `eid` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `event` datetime NOT NULL,
      PRIMARY KEY (`eid`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
    
    INSERT INTO `events` (`eid`, `event`) VALUES
    (1, '2014-09-25 02:07:00'),
    (2, '2014-09-25 04:06:00'),
    (3, '2014-09-25 05:50:00'),
    (4, '2014-09-26 02:07:00'),
    (5, '2014-09-26 04:15:00'),
    (7, '2014-09-29 01:08:00'),
    (8, '2014-09-29 04:21:00'),
    (6, '2014-09-29 05:02:00'),
    (9, '2014-09-29 05:25:00');
    
    我想计算每个事件和各自开始之间的时间差(以分钟为单位)

    目前,我正在从数据库中提取数据,将datetime条目转换为时间戳,并计算PHP中的差异。以下是一个简化的示例代码,其中包含编制的数字,以便于阅读:

    $events = range(1, 50);
    $beginnings = array(7, 11, 19, 27, 29, 36, 40, 43);
    $events = array_merge(array_diff($events, $beginnings));
    
    $differences = array();
    for($i = 0; $i < count($beginnings); $i++) {
        foreach($events as $event) {
            if($event > $beginnings[$i] && $event < $beginnings[$i + 1]) {
                $differences[] = $event - $beginnings[$i];
            }
        }
    }
    
    $events=范围(1,50);
    $BEGININGS=数组(7,11,19,27,29,36,40,43);
    $events=array_merge(array_diff($events,$beginings));
    $differences=array();
    对于($i=0;$i$beginnings[$i]&&&$event<$beginnings[$i+1]){
    $differences[]=$event-$beginations[$i];
    }
    }
    }
    
    我的问题:

    在查询过程中可以计算MySQL中的这些差异吗?
    示例:


    你是一家汽车厂的老板。每天晚上,在你睡觉之前,你告诉夜班的团队每人造一辆车,并记下他们何时完成。当你早上回来的时候,你想计算一下不同的团队制造各自的汽车花了多长时间。你可以看到一个团队在两个小时内完成了他们的汽车,而另一个团队需要五个小时来完成他们的汽车。你很好奇,所以你一直记下一年的时间,然后做一些统计。

    你可以使用函数
    datediff
    timediff

    SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31
    


    您还可以将这两个日期时间值转换为整数(自Unix纪元以来的秒数),并像普通数字一样进行减法运算

    SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19');
        -> 1196440219
    


    以下评论回复的示例。但是,您应该阅读SELECT、JOIN和WHERE语句。这是一个简单的MySQL,在使用更复杂的函数之前应该理解它。 看


    注意此选择将不会根据您的表结构工作,因为起始表缺少与事件的关系id。我在这里使用了
    eid
    。在使用该选项之前,您需要了解这两个表之间的关系,并相应地进行选择和调整。我看得出你们的桌子和atm有什么关系,不能在这里告诉你们吗。您的旧代码使用PHP硬编码关系,这意味着您无法在MySQL中执行此选择。

    好吧,如果是我,我可能会这样做

    DROP TABLE project_events;
    
    CREATE TABLE project_events
    (project_id INT NOT NULL
    ,event_date DATETIME NOT NULL
    );
    
    INSERT INTO project_events VALUES
    (1, '2014-09-24 22:44:00'),
    (1, '2014-09-25 02:07:00'),
    (1, '2014-09-25 04:06:00'),
    (1, '2014-09-25 05:50:00'),
    
    (2, '2014-09-25 21:32:00'),
    (2, '2014-09-26 02:07:00'),
    (2, '2014-09-26 04:15:00'),
    
    (3, '2014-09-28 22:01:00'),
    (3, '2014-09-29 01:08:00'),
    (3, '2014-09-29 04:21:00'),
    (3, '2014-09-29 05:02:00'),
    (3, '2014-09-29 05:25:00');
    
    SELECT project_id
         , MIN(event_date) start
         , MAX(event_date) end
         , TIMEDIFF(MAX(event_date)
         , MIN(event_date)) duration 
      FROM project_events 
     GROUP 
        BY project_id;
    +------------+---------------------+---------------------+----------+
    | project_id | start               | end                 | duration |
    +------------+---------------------+---------------------+----------+
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 05:50:00 | 07:06:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 04:15:00 | 06:43:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:25:00 | 07:24:00 |
    +------------+---------------------+---------------------+----------+
    
    此模式允许项目过度运行或重叠。您可能有充分的理由希望将“开始”存储在一个单独的表中,但考虑到这一点,调整此解决方案将是微不足道的。它只涉及项目id上的连接

    编辑:这里有一种方法可以比较该项目的开始日期和所有后续日期:

    SELECT x.project_id
         , MIN(y.event_date) start
         , x.event_date end
         , TIMEDIFF(x.event_date,MIN(y.event_date)) duration 
      FROM project_events x 
      JOIN project_events y 
        ON y.project_id = x.project_id 
     GROUP 
        BY x.project_id,x.event_date;
    +------------+---------------------+---------------------+----------+
    | project_id | start               | end                 | duration |
    +------------+---------------------+---------------------+----------+
    |          1 | 2014-09-24 22:44:00 | 2014-09-24 22:44:00 | 00:00:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 02:07:00 | 03:23:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 04:06:00 | 05:22:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 05:50:00 | 07:06:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-25 21:32:00 | 00:00:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 02:07:00 | 04:35:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 04:15:00 | 06:43:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-28 22:01:00 | 00:00:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 01:08:00 | 03:07:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 04:21:00 | 06:20:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:02:00 | 07:01:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:25:00 | 07:24:00 |
    +------------+---------------------+---------------------+----------+
    

    我理解。我不明白的是如何让MySQL知道我想要从多次表中计算特定时间的差异。当然,您可以在函数中使用
    SELECT column from table
    语句中的列名,而不是示例中的固定字符串。您的意思是类似
    SELECT DATEDIFF(事件>开始和事件<日期(日期添加(开始,间隔+1天)),从开始开始的事件中的事件)
    ?不。只需使用联接进行简单选择。我会尝试一些东西并将其添加到答案中。太棒了。谢谢。我会尝试。事件表与开始表有何关系?@AbhikChakraborty我不确定我是否理解您的问题。每个事件(清晨的一个时间)都从一个开始(前一天晚上的时间)。每个开始都可能导致多个事件,因此多个事件共享一个开始。希望这是有意义的。为什么开始是一个单独的表?肯定“开始”只是一系列事件中的第一个事件?@草莓是的,开始和事件都可以列在同一个表中,并用一列标识哪些日期时间是哪个。如果这样的表是数据库设计有助于实现我的目标,请解释如何实现。
    DROP TABLE project_events;
    
    CREATE TABLE project_events
    (project_id INT NOT NULL
    ,event_date DATETIME NOT NULL
    );
    
    INSERT INTO project_events VALUES
    (1, '2014-09-24 22:44:00'),
    (1, '2014-09-25 02:07:00'),
    (1, '2014-09-25 04:06:00'),
    (1, '2014-09-25 05:50:00'),
    
    (2, '2014-09-25 21:32:00'),
    (2, '2014-09-26 02:07:00'),
    (2, '2014-09-26 04:15:00'),
    
    (3, '2014-09-28 22:01:00'),
    (3, '2014-09-29 01:08:00'),
    (3, '2014-09-29 04:21:00'),
    (3, '2014-09-29 05:02:00'),
    (3, '2014-09-29 05:25:00');
    
    SELECT project_id
         , MIN(event_date) start
         , MAX(event_date) end
         , TIMEDIFF(MAX(event_date)
         , MIN(event_date)) duration 
      FROM project_events 
     GROUP 
        BY project_id;
    +------------+---------------------+---------------------+----------+
    | project_id | start               | end                 | duration |
    +------------+---------------------+---------------------+----------+
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 05:50:00 | 07:06:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 04:15:00 | 06:43:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:25:00 | 07:24:00 |
    +------------+---------------------+---------------------+----------+
    
    SELECT x.project_id
         , MIN(y.event_date) start
         , x.event_date end
         , TIMEDIFF(x.event_date,MIN(y.event_date)) duration 
      FROM project_events x 
      JOIN project_events y 
        ON y.project_id = x.project_id 
     GROUP 
        BY x.project_id,x.event_date;
    +------------+---------------------+---------------------+----------+
    | project_id | start               | end                 | duration |
    +------------+---------------------+---------------------+----------+
    |          1 | 2014-09-24 22:44:00 | 2014-09-24 22:44:00 | 00:00:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 02:07:00 | 03:23:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 04:06:00 | 05:22:00 |
    |          1 | 2014-09-24 22:44:00 | 2014-09-25 05:50:00 | 07:06:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-25 21:32:00 | 00:00:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 02:07:00 | 04:35:00 |
    |          2 | 2014-09-25 21:32:00 | 2014-09-26 04:15:00 | 06:43:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-28 22:01:00 | 00:00:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 01:08:00 | 03:07:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 04:21:00 | 06:20:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:02:00 | 07:01:00 |
    |          3 | 2014-09-28 22:01:00 | 2014-09-29 05:25:00 | 07:24:00 |
    +------------+---------------------+---------------------+----------+