2014-11-06 17 views
0

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

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。但是,我想驗證,如果每分鐘有一列,這樣我就可以驗證測量仍然是正確的未來

現在,我已經想過通過循環的結果,將每個返回日期時間到數組:

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

然後,通過充滿的紀要數組循環一天,但這是非常密集的我猜想,特別是當你有500,1000,5000甚至30000個ID可以通過時。什麼是最好的方式去做這件事?

+0

我會將它加入日曆表中,該日曆表中將包含所有分鐘。這樣,當行丟失時,您也可以顯示0個計數。 – 2014-11-06 13:53:03

+0

計算有多少個不同的記錄,並在兩個日期時間值之間做一個時間差異。這會給你兩個日期時間之間的總分鐘數,計數會給你多少記錄。如果兩個值不同,那麼你在某個地方缺少分鐘。 – 2014-11-06 14:07:10

回答

0

你可以用這樣的小時和分鐘創建一個臨時表。通過使用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)。

1

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

0

你可以使用這樣的過程來創建一個表,每分鐘。

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表,找到missings

0

一種方式來做到這一點是生成一系列的臨時行,一個一天你有興趣的每一分鐘(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 
相關問題