2012-01-24 12 views
0

私は2つの列、タイムスタンプとスパンを持つMYSQLテーブルを持っています。 timestampはunixタイムスタンプですが、spanは整数です。unix-timestampから時間範囲を選択

タイムスタンプが現在の時刻とスパンの半分の間のすべての行を選択したいとします。

例:現在の時刻が23:00の場合は、タイムスタンプ時間が21と01の間にあるすべての行が必要です。問題はもちろん、すべてのタイムスタンプは異なる日からのものです。

は、私は日私はこれを行う方法を考え出した

だけの時間を気にしない、明確にするために、それは、そのようなハックのように思えます。より多くのMYSQLの知識を持つ人が私にこれを行うためのよりきれいな方法を示すことができると確信しています。

SELECT * 
    FROM table 
    WHERE (
     TIME(DATE_SUB(CURDATE() , INTERVAL(span /2) HOUR)) <= TIME(DATE_ADD(CURDATE() , INTERVAL(span /2) HOUR)) 
     AND (
      TIME(FROM_UNIXTIME(timestamp)) >= TIME(DATE_SUB(CURDATE() , INTERVAL(span /2) HOUR)) 
      AND TIME(FROM_UNIXTIME(timestamp)) <= TIME(DATE_ADD(CURDATE() , INTERVAL(span /2) HOUR)) 
      ) 
     ) 
    OR (
     TIME(DATE_SUB(CURDATE() , INTERVAL(span /2) HOUR)) >= TIME(DATE_ADD(CURDATE() , INTERVAL(span /2) HOUR)) 
     AND (
      TIME(FROM_UNIXTIME(timestamp)) >= TIME(DATE_SUB(CURDATE() , INTERVAL(span /2) HOUR)) 
      OR TIME(FROM_UNIXTIME(timestamp)) <= TIME(DATE_ADD(CURDATE() , INTERVAL(span /2) HOUR)) 
     ) 
    ) 

答えて

0

かなり解決策が見つかりませんでしたが、これが私のやり方です。

SELECT * 
    FROM table 
    WHERE date_add(from_unixtime(timestamp) , INTERVAL datediff(now() , from_unixtime(timestamp)) DAY) 
    BETWEEN date_sub(now() , INTERVAL (span/2) HOUR) 
    AND date_add(now() , INTERVAL (span/2) HOUR) 
    OR date_add(from_unixtime(timestamp) , INTERVAL datediff(now() , from_unixtime(timestamp)) -1 DAY) 
    BETWEEN date_sub(now() , INTERVAL (span/2) HOUR) 
    AND date_add(now() , INTERVAL (span/2) HOUR) 
0

2つのオプションをおすすめします。

  1. 「ハック」クエリをベンチマークし、2つのMySQLクエリを実行するよりも速いかどうかを確認します。例:ターゲット行を取得する1つのクエリ、±1/2スパンで結果を取得するもう1つのクエリ。
  2. 適切なMySQLストアドプロシージャを作成します。これは事実上オプション(1)ですが、すべてDB内で実行されます。

もう一つのオプションは、過去の痛みに基づいて、ストアドプロシージャを避けるためにMySQL変数を効果的に使用することです(例:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html)。このアプローチは、PHP/MySQLの昔のアプリケーションでは一般的でした。

私の経験上、オッズは良い選択肢です(1)は十分速くて読みやすいです。