Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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_Bigdata - Fatal编程技术网

Php 如何检查MySQL数据库中每分钟是否有一行?

Php 如何检查MySQL数据库中每分钟是否有一行?,php,mysql,bigdata,Php,Mysql,Bigdata,我现在有 SELECT *, COUNT(*) as `numrows` FROM `data` WHERE `datetime` BETWEEN '2014-11-04 00:00:00' AND '2014-11-04 23:59:59' AND `project_id` = 1 GROUP BY DATE(`datetime`), HOUR(`datetime`), MINUTE(`datetime`) 现在,这将返回所有行,其中一些行具有重复项,因此numrows将为2。

我现在有

SELECT *, COUNT(*) as `numrows`
FROM `data`
WHERE `datetime`
    BETWEEN '2014-11-04 00:00:00' AND '2014-11-04 23:59:59'
AND `project_id` = 1
GROUP BY
 DATE(`datetime`),
 HOUR(`datetime`),
 MINUTE(`datetime`)
现在,这将返回所有行,其中一些行具有重复项,因此numrows将为2。但是,我想验证每分钟是否有一行,这样我就可以验证测量值是否仍然正确地进入

现在,我考虑了在结果中循环,将每个返回的datetime添加到一个数组中:

while($s = $select->fetch_assoc()) {
 $availableTimes[] = $s['datetime'];
}

然后,在一个数组中循环一天中的分钟数,但我想这是非常密集的,特别是当你们有500个、1000个、5000个甚至30000个ID要通过的时候。最好的方法是什么?

您可以创建一个包含小时和分钟的临时表,如下所示。您可以使用DISTINCT删除任何重复项

SELECT DISTINCT HOUR(`datetime`) AS HOUR, MINUTE(`datetime`) AS MINUTE
FROM `data`
WHERE `datetime`
    BETWEEN '2014-11-04 00:00:00' AND '2014-11-04 23:59:59'
AND `project_id` = 1
然后,您可以通过在外部添加select count*来计算临时表中的行数,如下所示

SELECT COUNT(*) FROM (
SELECT DISTINCT HOUR(`datetime`) AS HOUR, MINUTE(`datetime`) AS MINUTE
FROM `data`
WHERE `datetime`
    BETWEEN '2014-11-04 00:00:00' AND '2014-11-04 23:59:59'
AND `project_id` = 1) AS TEMP

如果所有小时和分钟都有行,则结果应为1440 24*60。

如果使用group by在一天中每分钟只获得一行,则可以使用获得的行数。
您应该每天都有24*60个查询结果,因为我知道这就是您所需要的全部

您可以使用这样的过程为每分钟创建一个表

CREATE PROCEDURE `make_intervals`(startdate timestamp, enddate timestamp, intval integer, unitval varchar(12))
BEGIN


   declare thisDate timestamp;
   declare nextDate timestamp;
   set thisDate = startdate;




   drop temporary table if exists time_intervals;
   create temporary table if not exists time_intervals
      (
      interval_start timestamp,
      interval_end timestamp
      );




   repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into time_intervals select thisDate, timestampadd(MICROSECOND, -1, nextDate);
      set thisDate = nextDate;
   until thisDate > enddate
   end repeat;
end


call make_intervals('2014-11-04 00:00:00' ,'2014-11-04 23:59:59',1,'MINUTE');

然后将您的表连接到timer_Interval表,并查找遗漏。一种方法是生成一系列临时行,每天每分钟生成一行1440行。然后,将外部数据连接到此数据表中,并计算在该数据时间在数据表中找到的行数

SELECT aDateTime, COUNT(data.datetime)
FROM
(
    SELECT DATE_ADD('2014-11-04 00:00:00', INTERVAL a.Mnt + b.Mnt * 10 + c.Mnt * 100 + d.Mnt * 1000 MINUTE) AS aDateTime
    FROM (SELECT 0 AS Mnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a
    CROSS JOIN (SELECT 0 AS Mnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b
    CROSS JOIN (SELECT 0 AS Mnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c
    CROSS JOIN (SELECT 0 AS Mnt UNION SELECT 1) d
    WHERE (a.Mnt + b.Mnt * 10 + c.Mnt * 100 + d.Mnt * 1000) < 1440
) sub0
LEFT OUTER JOIN `data` 
ON sub0.aDateTime = data.datetime
AND data.project_id = 1
GROUP BY aDateTime

我会把它放在一个日历表上,里面有所有的分钟数。这样,当行丢失时,也可以显示0个计数。计算有多少不同的记录,并在两个日期时间值之间进行时间差。这将给出两个日期时间之间的总分钟数,计数将给出有多少条记录。如果这两个值不同,那么您将在某个地方缺少分钟。