2012-06-30 81 views
4

零或零填充空白時間我寫了按小時計算的記錄小時查詢:分組記錄按小時或按天白天和mysql的

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'),count(*) from req group by 
TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'); 

結果是:

2012-02-22 13 2280 
2012-02-22 15 1250 
2012-02-22 16 1245 
2012-02-22 19 1258 

但我需要這樣一個結果:

2012-02-22 13 2280 
2012-02-22 14 0 
2012-02-22 15 1250 
2012-02-22 16 1245 
2012-02-22 17 0 
2012-02-22 18 0 
2012-02-22 19 1258 

我也有這些查詢該組的日和月呢!

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD'),count(*) from req 
group by TO_CHAR(copied_timestamp, 'YYYY-MM-DD'); 

select TO_CHAR(copied_timestamp, 'YYYY-MM'),count(*) from req 
group by TO_CHAR(copied_timestamp, 'YYYY-MM'); 

我需要他們的空白填充零或null。 任何幫助真的很感激。

注意: 在oracle中使用CONNECT BY有一個答案,但我需要在Mysql中的答案,因爲Mysql不支持CONNECT BYHere is the link

+0

是否有表'24'記錄每天,代表當天的每個小時? –

+0

實際上,它可以有更多的記錄。每秒可能有5個或更多記錄! – Heidarzadeh

+1

引用問題中'CONNECT BY'和'LEVEL'的唯一目的是生成行。它是Oracle中的一個習慣用語,它應該在Mysql中有相同的功能,它可以做同樣的事情。也許這將有助於:http://stackoverflow.com/questions/1806484/generate-many-rows-with-mysql –

回答

1

我創建了一個名爲1 TBL_NUMBERS

CREATE TABLE `TBL_NUMBER` (`n` int(11) NOT NULL) 

和插入的記錄表1000 現在我可以用這個查詢產生的任何類型的日期範圍:

SELECT '2012-06-21' + INTERVAL n-1 [DAY | HOUR | MINUTE] or as dateRange 
FROM TBL_NUMBER 
WHERE '2012-06-21' + INTERVAL n-1 [DAY | HOUR | MINUTE] <= '2012-06-23'; 

然後我可以加入這張表與我的結果填補了日期的空白。 如果我需要超過1000的日期範圍,我可以在TBL_NUMBER

插入更多的記錄,如果你有更好的主意,我很想知道;)

+0

不錯的選擇! – RandomSeed

2

生成單列dates_hours表,該表包含在合理範圍內(例如從1900到2200)的所有日期和小時數。 然後從此表執行LEFT JOIN到您當前的查詢。

對於這種技術要正確執行,你可能需要對索引列添加到您的表,它包含轉換後的時間戳(你copied_timestamp轉換爲DATETIME,四捨五入到小時)

SELECT date_hour, count(req.converted_timestamp) 
FROM 
    dates_hours 
    LEFT JOIN req ON req.converted_timestamp = dates_hours.date_hour 
WHERE date_hour 
    BETWEEN (SELECT MIN(req.converted_timestamp) FROM req) 
    AND (SELECT MAX(req.converted_timestamp) FROM req) 
GROUP BY date_hour 

要生成在dates_hours表:

CREATE TABLE dates_hours (date_hour DATETIME PRIMARY KEY); 

DELIMITER $$$ 
CREATE PROCEDURE generate_dates_hours (to_date DATETIME) 
BEGIN 

    DECLARE start_date DATETIME; 
    DECLARE inc INT; 

    SELECT MAX(date_hour) INTO start_date FROM dates_hours; 
    IF start_date IS NULL THEN 
     SET start_date = '1900-01-01'; 
    END IF; 
    SET inc = 1; 
    WHILE start_date + INTERVAL inc HOUR <= to_date DO 
     INSERT INTO dates_hours VALUE (start_date + INTERVAL inc HOUR); 
     SET inc = inc +1; 
    END WHILE; 

END $$$ 
DELIMITER ; 

CALL generate_dates_hours('2200-01-01'); 

好了,現在我校對我自己,我意識到這是很牽強的解決方案。我希望有人提出一個更優雅的。

+0

謝謝犛牛。這解決了問題,但對於我的用例來說,維護代碼有點困難。我找到了另一個解決方案並將其發佈到此處。渴望瞭解你的想法。 – Heidarzadeh