2009-06-24 4 views
1

私は、レビューと呼ばれるMySqlテーブルを持っています。これは長年蓄積された多数の製品レビューを格納し、それぞれに日付タイムスタンプが付いています。
私は自分のシステムの重要な日付を見つけることを望んで、私が毎年累計したレビューの数を示す棒グラフを描きたかったのです。MySqlの閏年

私はしかし、これは366行の代わりに、365を返していることに気づいた後、私は一日の指数は、によって相殺なっているので、私は、このチャートを作るためにこれを使用することができないことに気づいた

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

このクエリを使用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

月ごとにグループ化し、毎月すすぎ、繰り返してください。

関連する問題