2012-02-29 17 views
2

所以我有這張桌子。它有幾百行。每行都有一個日期時間字段。我需要做的是在給定的時間段內得到多少行,但不是整個時期,而是在這個時期的每一天。直到這一點,我知道該怎麼做。但此外我也需要有對天行不具有表中的任何一行值爲0如何在MySQL中每隔一天也分組行數?

因此,例如:

2012-01-01 12:13 
2012-01-01 43:32 
2012-01-03 23:32 

應該給我的結果是這樣的:

2012-01-01 2 
2012-01-02 0 
2012-01-03 1 

任何人都可以幫忙?

+0

[獲取日期,即使它不存在於SQL SELECT語句中的表中]的可能重複(http://stackoverflow.com/questions/9228262/get-date-even-if-it-doesnt-exist-in -table-from-sql-select-statement) – 2012-02-29 12:39:32

+0

[Mysql:選擇兩個日期之間的所有數據]的可能的重複(http://stackoverflow.com/query esot/1080207/mysql-select-all-data-between-two-dates) – kapa 2012-02-29 12:41:14

回答

3

處理與0對應的記錄日期,我通常的做法是使用日曆表加入上。

例如,創建一個表稱爲calendar_date一個領域,每日期填充它從1st Jan 200031st Dec 2070,或適合你的報告目的的一些其他範圍。

然後使用類似...

SELECT 
    calendar.calendar_date, 
    COUNT(*) 
FROM 
    calendar 
LEFT JOIN 
    yourData 
    ON yourData.timeStamp >= calendar.calendar_date 
    AND yourData.timeStamp < calendar.calendar_date + 1 
WHERE 
     calendar.calendar_date >= '01 Jan 2012' 
    AND calendar.calendar_date < '04 Jan 2012' 
GROUP BY 
    calendar.calendar_date 

這個表可以有許多額外的用途,如下垂銀行假期,開始幾周和幾個月的。謹慎使用標誌和索引,您可以從中獲益良多。

+0

以及如何創建calendar_date表? – 2012-02-29 12:45:42

+0

就像你平時所做的一樣。 'CREATE TABLE calendar(calendar_date DATETIME)'等等,然後運行一個循環或其他東西來填充值。一旦你完成了一次,你就有了一個維度表來加入你的數據。 – MatBailie 2012-02-29 12:47:51

0

嘗試

SELECT DATE_FORMAT(YourDate, '%Y-%m-%d') as YourDate, COUNT(*) 
FROM TableName where YourDate= 'date' 
GROUP BY YourDate 
+1

像前面兩個(哦,現在已刪除)答案......'這不處理0行的日子' – MatBailie 2012-02-29 12:43:55

2

如果你沒有在它的日期列表的表,你可以模擬一個與類似下面的查詢:

select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from 
(select 0 i 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) t0, 
(select 0 i 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) t1, 
(select 0 i 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) t2, 
(select 0 i 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) t3, 
(select 0 i 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) t4) v 
where calendar_date between ? /*start of date range*/ and ? /*end of date range*/ 

- 所以民主黨的查詢將變成:

SELECT 
    calendar.calendar_date, 
    COUNT(*) 
FROM 
    (select * from 
    (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from 
    (select 0 i 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) t0, 
    (select 0 i 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) t1, 
    (select 0 i 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) t2, 
    (select 0 i 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) t3, 
    (select 0 i 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) t4) v 
    WHERE calendar_date >= '01 Jan 2012' 
    AND calendar_date < '04 Jan 2012' 
) calendar 
LEFT JOIN 
    yourData 
    ON yourData.timeStamp >= calendar.calendar_date 
    AND yourData.timeStamp < calendar.calendar_date + 1 
相關問題