2011-11-03 40 views
0

私は日付範囲でグループ化されたデータを返すクエリを作成しようとしていますが、1つのクエリ(計算を含む)でそれを行う方法があるのか​​、別の3つのクエリを書く必要があるのだろうか?私のテーブルの日付は、Unixタイムスタンプとして保存されます。MySqlクエリ - 日付範囲でグループ化しますか?

は例えば、私のレコードは次のようになります。

  1. 2011-05:

    id type timestamp 
    312 87 1299218991 
    313 87 1299299232 
    314 90 1299337639 
    315 87 1299344130 
    316 87 1299348977 
    497 343 1304280210 
    498 343 1304280392 
    499 343 1304280725 
    500 343 1304280856 
    501 343 1304281015 
    502 343 1304281200 
    503 343 1304281287 
    504 343 1304281447 
    505 343 1304281874 
    566 90 1305222137 
    567 343 1305250276 
    568 343 1305387869 
    569 343 1305401114 
    570 343 1305405062 
    571 343 1305415659 
    573 343 1305421418 
    574 343 1305431457 
    575 90 1305431756 
    576 343 1305432456 
    577 259 1305441833 
    578 259 1305442234 
    580 343 1305456152 
    581 343 1305467261 
    582 343 1305483902 
    

    は私が間、「作成」の日付を持つすべてのレコードを検索しますクエリを記述しようとしています-01と2011-06-01(月)

  2. 2011-03-01と2011-06-01(四半期)
  3. 2010-05-01 AND 2011-06-01(年)

私は(このケースでは、私は...私はそれが仕事を得ることができるかどうかを確認するだけで月のUNIX値をハードコード)次のことを試してみました:

SELECT COUNT(id) AS idCount, 
MIN(FROM_UNIXTIME(timestamp)) AS fromValue, 
MAX(FROM_UNIXTIME(timestamp)) AS toValue 
FROM uc_items 
WHERE ADDDATE(FROM_UNIXTIME(timestamp), INTERVAL 1 MONTH) 
     >= FROM_UNIXTIME(1304233200) 

しかし、それはいないようですfromValueが:2011-04-02 21:12:56であり、toValueが2011-10-25 06:20:14であることは明らかです。2011年5月1日から2011年6月20日までの間の日付ではありません。 1/2011。

答えて

2

このいやしくもが動作するように:

SELECT COUNT(id) AS idCount, 
    FROM_UNIXTIME(MIN(timestamp)) AS fromValue, 
    FROM_UNIXTIME(MAX(timestamp)) AS toValue 
FROM uc_items 
WHERE timestamp BETWEEN UNIX_TIMESTAMP('2011-05-01') AND UNIX_TIMESTAMP('2011-06-01 23:59:59') 

また、パフォーマンスのヒントとして - WHERE句(例えば、あなたがWHERE ADDDATE(FROM_UNIXTIME(timestamp))を持っている)で、あなたの表の列に関数を適用することは避けてください。そうすることで、MySQLがtimestampカラムのインデックスを使用できなくなります。

関連する問題