2011-10-27 1 views
2

私は基本的にUNIXのタイムスタンプを含むcreated_atという列のテーブル(名前はtasks)を持っています。MySQLで日付を比較するには?

指定した時間間隔で作成された結果のみを選択する必要があります。

間隔は、today,tomorrow,this weekおよびthis monthである。

タイムスタンプをYYYY-MM-DD HH:MM:SSの形式に変換すると、MySQLが処理できると思います。

また、BETWEENも使用する必要があると思います。

タイムスタンプを渡して、指定された間隔でデータベースに格納されているタイムスタンプと照合して比較します(チェック?)。変換するには、FROM_UNIXTIMEを使用する必要があります。

どのように指定するのですか?アドバイスありがとう!

答えて

7

UNIX_TIMESTAMPを変換する必要があります。

クエリ

SELECT * FROM tasks 
WHERE created_at BETWEEN UNIX_TIMESTAMP(DATE_SUB(now(),INTERVAL 1 DAY)) 
        AND UNIX_TIMESTAMP(now()) 

次の操作を行うことにより、一週間のインターバル、月などを変更することができます。

INTERVAL 1 WEEK 
INTERVAL 1 MONTH 
INTERVAL 1 YEAR 

MySQLは自動的ヶ月の長さを取り、考慮など閏年ます。

上記のクエリでは、MySQLはインデックスを使用することができ、高速化が進んでいます。
ではないことを確認してください。この場合、MySQLはそのフィールドでインデックスを使用することができず、時間が大幅に減ります。

、非常に遅いコーディングホラー

SELECT * FROM tasks 
WHERE FROM_UNIXTIME(created_at) BETWEEN DATE_SUB(now(),INTERVAL 1 DAY) 
            AND now() 

参照:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

+0

@Tadeck、ありがとう:-) – Johan

+0

問題はない、ちょっと単純なタイプミス。 – Tadeck

+0

ありがとう、Johan。今月はどうですか?どのくらい私は間隔として置く必要がありますか? 30? – daGrevis

1

私はcreated_atとの推測がINTのように定義されていて、それにタイムスタンプを格納します。その後、今日、たとえば、のための最善の方法は、次のようになります。

FROM_UNIXTIME(created_at) BETWEEN CURDATE() AND (CURDATE() + INTERVAL 1 DAY)

、しかし、あなたはおそらくMySQLを作るために何のチャンスを持っていないでしょう:以下

created_at BETWEEN UNIX_TIMESTAMP(CURDATE()) AND UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)

注意も動作します列インデックスを使用します。週/月には、WEEK()とMONTH()組み込み関数(現在の週/月の最初の秒のタイムスタンプを取得する)を使用するより複雑なロジックが必要です。