2016-04-27 11 views
0

次のタスクを実行するための広範なクエリを作成しようとしています。MySQLの日付差のクエリ

  • 「time_stamps」DBからフィールド「time_stamp」と「status」を選択し、「time_stamp」ASCで順序付けします。
  • 返されるフィールドのうち、タイムスタンプの各ペア(1インチと1アウト)について、時間差を取得する必要があります。

ここまでは、私がこれまでに質問した内容です。

次に、2つの日付からの時間差を取得するこのクエリがあります。

SELECT TIMESTAMPDIFF(SECOND, '2016-04-26 07:01:26', '2016-04-26 15:07:55')/3600.0 

理想的には、このようなデータを返すようにしたいと思います。

time_stamp   status difference 
2016-04-18 06:57:04  1 
2016-04-18 11:19:49  0 8.11 
2016-04-18 11:41:01  1 
2016-04-18 15:21:02  0 3.67 
2016-04-19 07:06:16  1 
2016-04-19 10:58:34  0 3.87 
2016-04-19 11:18:50  1 
2016-04-19 15:16:00  0 3.95 
2016-04-20 06:58:30  1 
2016-04-20 12:46:33  0 5.80 

私はこれを達成するためのストアドプロシージャまたは類似した何かを記述する必要がありますが、私は完全にはわからないことを考えていました。誰かがここからどこへ行くべきか、正しい方向に向けることができますか?私はこの全文を私のために書く人を探しているわけではなく、ちょうど正しい方向に微笑んでいます。ありがとう!

答えて

0
SELECT time_stamp, status, 
     TIMESTAMPDIFF(
       SECOND, 
       (
       SELECT ti.time_stamp 
       FROM time_stamps ti 
       WHERE ti.user_id = t.user_id 
         AND ti.time_stamp <= t.time_stamp 
         AND t.status = 0 
         AND ti.status = 1 
       ORDER BY 
         ti.user_id DESC, ti.time_stamp DESC 
       LIMIT 1 
       ), 
       time_stamp 
       ) 
FROM time_stamps t 
WHERE user_id = :myuserid 

は速く動作するように、このために(user_id, time_stamp)上の複合インデックスを作成します。

+0

私はあなたのコードが完璧に動作するように手を加えました。あなたの助けてくれてありがとうQuassnoi! – Kronos1

0

右方向にだけナッジ、あなたが尋ねたよう:

どの程度

ことから
SELECT @previous, @previous := `time_stamp`, `status` 
FROM time_stamps 
ORDER BY `time_stamp`; 

と仕事。

この場合、列の順序が重要であることに注意してください。最初に検索する前に割り当てるとしたら、(明らかに多分)動作しません。コンセプトの

証明:http://sqlfiddle.com/#!9/4e17b5/2