2009-08-23 11 views
1

Unixのタイムスタンプ(int(11))として保存されている日付情報を持つデータベースで作業しています。過去X日のエントリのみを返します例えば、過去90日間。MySQL - 過去X日のエントリのみを返します

私は何を作ってみたことはある:

'時間' はデシベルでのint(11)である
SELECT * FROM mytable WHERE category=1 AND 
FROM_UNIXTIME(time) > DATE_SUB(now(), INTERVAL 91 DAY) 

。これは正常に動作しているように見えますが、他の人がこれについて考えていることは不思議です。

答えて

2
SELECT * FROM mytable WHERE category=1 AND 
time > (UNIX_TIMESTAMP() - ((60*60*24)*90)) 

やmytableはFROM単に

SELECT * WHEREカテゴリ= 1、 時間>(UNIX_TIMESTAMP() - (86400 * 90))、この中

これは単に数を比較している(秒ケース)

+0

ありがとう、ちょうどこれを試して、うまくいくようです。 –

+0

また、より速く働くので、(時間の関数ではなく時間の関数を比較するので)あなたのケースでは不可能な 'time'のインデックスを使用することができます。 **しかし**!非常に奇妙な人間の趣味には、夏時間のように大きな問題があります。それは時間のITの何十億ドルのコストを持っている必要があります... – flaschenpost

0

ちょっと考えてみたら、それ以外の方法ではDBの作業が減りますか?

time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 91 DAY)) 
+0

TO_UNIXTIME明らかに私のバージョンのmysqlに存在しません:) –

+0

おっと...私はunix_timestampを意味しました:) – Zed

+0

それは夏時間も - セーブ。 – flaschenpost

0

このクエリは、MySQLが不可能なインデックスを利用するすべての行の日付の変換を行う必要があるとして、あなたが道をダウン頭痛引き起こすことがバインドされています。 Unixのタイムスタンプは数字なので、タイムスタンプを別の日付形式に変換する代わりに、検索日をUNIXのタイムスタンプに変換します。

+0

私のテストクエリは、0.0046秒の近傍で実行されています。上記の最初の回答からの私のオリジナルのクエリとクエリの両方は、実際には時間の点で大きな違いはありません。 –

+1

私はそうだと確信していますが、100-500kのテストレコードをテーブルにロードしてから、実行時間を確認してみてください。また、0.0046はキャッシュされたクエリの実行時間になる場合があります。いくつかのパラメータを変更してクエリを再実行しようとします。 –

+0

私のテストクエリはSELECT *でした。これをいくつかのランダムな列に変更しました。 0.0044秒。私は1年前に戻ってくるようにクエリを変更しましたが、それは0.0025秒で599レコードを返しました - 最も速いクエリです。残念なことに、私はテストレコードを持っていません。db内のレコードだけですが(かなり良いサイズです)。 –

0

タイムスタンプをintとして格納する理由は何ですか?私は多くのDate Time functions mysqlを使用できるので、mysql DATETIMEデータ型を使用します。

このフィールドのデータ型を制御できない場合は、クエリを実行してそのように比較する前に、日付をunixタイムスタンプintに変換します。

+0

それはそれが行われた方法です、そして、私はこの時点でそれを変更するのが快適ではありません。クエリが0.0046秒の近傍で実行されているため、パフォーマンス上の問題ではないようですか? –

関連する問題