2009-06-24 107 views
1

我有一個名爲reviews的MySql表,它存儲了很多產品評論,多年累積,每個評論都使用日期時間戳註釋。
我想繪製一張條形圖,顯示一年中每天累積的評論數量,希望找到我係統的重要日期。MySql閏年

我用這個查詢

select dayofyear(date),count(*) from reviews group by dayofyear(date); 

但是,注意,這是返回366行,而不是365後,我意識到,我不能用這個做這個圖表,因爲當天指數是越來越被抵消1每閏年,這是歪曲我的數據。

例如,聖誕節在大多數年份顯示爲#359,而在閏年#360。

解決這種歪斜的最簡單方法是什麼?

在一個旁註,有沒有什麼軟件包,可以接受一個SQL查詢,並將結果直接作爲條形圖返回(當條形圖是有道理的)

回答

3

我沒有測試過這一點,但你可以做類似如下:

SELECT 
     # check if the year is a leap year: 
     IF((YEAR(mydate) % 4 = 0 AND YEAR(mydate) % 100 != 0) OR YEAR(mydate) % 400 = 0, 
      # if so, check if the date is before or after february 29th. if that is the case, we subtract one from the value 
      IF(DAYOFYEAR(mydate) > DAYOFYEAR("2008-02-28"), DAYOFYEAR(mydate) - 1, DAYOFYEAR(mydate)), 
      # if the year isn't a leap year, just return the regular dayofyear() value 
      DAYOFYEAR(mydate)) 
    FROM mytbl 

這將合併爲28日和29日爲閏年的數據,但在閏年和非閏年的所有日子裏給了天一樣的偏移。更理想的行爲可能是簡單地忽略2月29日的數據,這可以使用附加條件來完成。你也可以爲它分配一個特殊的索引,比如400,這不會抵消其他所有的日子。

一個更好的辦法可能是由組每月月和日:

select month(date) m, day(date) d, count(*) from reviews group by m, d; 

這一起避免了這個問題,但可能會更加複雜,你在你的應用程序邏輯處理。不過,我認爲這是一個更好的方法來做到這一點。

1

將它們按月份分組,並沖洗並重復每個月?