簡體   English   中英

如何檢查一天中的每一分鍾在MySQL數據庫中是否有一行?

[英]How to check if each minute in a day has a row in the MySQL database?

我目前有

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`)

現在,它將返回所有行,其中一些行具有重復項,因此,行數將為2。但是,我想驗證每分鍾是否有一行,因此我可以驗證測量值是否仍正確輸入。

現在,我考慮過遍歷結果,將每個返回的datetime添加到數組中:

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

然后,循環遍歷一天中所有分鍾的數組,但是我想這非常耗時,尤其是當您要經過500、1000、5000甚至30000個id時。 最好的解決方法是什么?

如果一天中每分鍾只獲得一行(使用分組依據),則可以使用獲得的行數。 您每天應該有24 * 60的查詢結果(據我所知,這就是您所需要的..?)

您可以使用這樣的小時和分鍾創建一個臨時表。 您使用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(*) 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)。

您可以使用類似的過程每分鍾創建一個表。

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_intervals表並查找缺失

一種方法是生成一系列臨時行,對於您感興趣的每一分鍾(1440行)。 然后,您將LEFT OUTER JOIN聯接到此數據,並在數據表中計算該數據時間找到的行數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM