2017-01-09 19 views
1

データに日付と時刻が関連付けられたmysqlテーブルがあります。各行は、データの日付と、このようにしています2つの日付時刻の間に異なるデータをすべて選択してください

datetime    name 
2009-06-25 10:00:00 jhon 
2009-06-25 10:00:05 jack 
2009-06-25 10:00:11 json 
2009-06-25 10:00:15 jack 

私の問題は、私は、行は異なる第二日付1と、このようなdate2のを取得する必要がある:

datetime    name  second 
2009-06-25 10:00:00 jhon  0 
2009-06-25 10:00:05 jack  5 
2009-06-25 10:00:11 json  6 
2009-06-25 10:00:15 jack  4 

+0

のような違いを見つけることができますラインで「gps_trs_location FROM(日時))」の近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してくださいそうですね、コメントを削除します –

+0

自己結合を使用してこれを取得します –

答えて

1

機能をいただき、ありがとうございますあなたが探しているのはLAGです。これは、MySQLではなく、多くのデータベースで解析機能として利用できます。ただし、セッション変数を使用してこの機能をシミュレートできます。

SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable); 

SELECT t.datetime, 
     t.name, 
     t.curr_dt - t.lag_dt AS second 
FROM 
(
    SELECT @dt:=UNIX_TIMESTAMP(datetime) curr_dt, 
      @dt lag_dt, 
      datetime, 
      name 
    FROM yourTable 
    ORDER BY datetime, name 
) t 
+0

これはアプローチがかなり速いです – sumit

+0

@tim ..itsすべての行で0秒に秒差を示しています..ユーザーあたり期待通りではありません.http:// sqlfiddle .com /#!9/a295e8/3 –

+0

@AnkitAgrawalセッション変数は、フィドルでは動作していないようです。実際のWorkbenchでテストする必要があります。 –

0

結果は:

[SQL] SETの@dt =(gps_trs_location FROM MIN UNIX_TIMESTAMP(日時)を選択します)。 [Err] 1064 - SQL構文にエラーがあります。 1

+0

申し訳ありませんが、これを使用してください: 'SET @dt =(SELECT MIN(UNIX_TIMESTAMP(datetime)FROM yourTable);' –

1

あなたは最寄りの日付を見つけて、以下の

select 
    datetime, 
    name, 
    TIME_TO_SEC(TIMEDIFF(datetime, prev_date)) diff 
    FROM 
    (
     SELECT 
     datetime, 
     name, 
     (select datetime from tbl t1 where t1.datetime<tbl.datetime order by datetime desc limit 1) as prev_date 
     FROM 
     `tbl` 
    )tmp 
+0

これは素晴らしい代替手段です合理的なサイズのデータ​​セットの場合は問題ありません。 –

関連する問題