2017-08-14 5 views
0

間の時間差を計算します。どうすればそれを達成できますか?現在、ここには、私は自分のWebアプリケーション用のテーブルを以下の持っていると私は、現在の行と前の行との間の時間差を取得するために別の列を追加したい現在の行と前の行

私は日時差でサンプル件のデータを与える

$stmt = $db->prepare("SELECT device,lat,lon, speed, mode, DATE (`currentTime`) ,TIME_FORMAT(`currentTime`, '%H:%i:%s') 
          FROM myTable 
          WHERE device=? limit ?"); 
$stmt ->bind_param('ii', $device_Number ,$limit); 
$stmt ->bind_result($device, $lat, $lon, $speed, $mode, $currentDate, $currentTime); 
$stmt ->execute(); 
ここ

enter image description here

+0

です。なぜあなたはそれをしたいのですか? –

+0

私はそれをDBに格納しませんが、本当に必要なときにそれを計算します。 DBサイドでhttps://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediffで、またはPHPでDateTimeを使用することができます:Diff http:// php .net/manual/de/datetime.diff.php – user1915746

+0

私はさらなる計算のために各行の時間差を知る必要があるので。 – Achilles

答えて

1

PHPアプリケーションからの私のSQLの呼び出しで、ここではあなたが2つの異なる列のデータを保存していることは ように日付差を取ります2列 '時間差' と 'daydifference'

testtimeテーブル

id date1  time1 
    1 2017-08-14 01:06:11 
    2 2017-08-14 01:09:13 
    3 2017-08-14 01:16:10 
    4 2017-08-14 01:21:00 
    5 2017-08-15 01:21:00 
    6 2017-08-15 02:13:00 

MySQLのクエリは、DBの行に次のようなものを保存するために少し冗長なようだ

SELECT A.id, A.time1, TIMESTAMPDIFF(SECOND,A.time1,B.time1) AS timedifference, 
    TIMESTAMPDIFF(DAY,A.date1,B.date1) AS daydifference 
    FROM testtime A INNER JOIN testtime B ON B.id = (A.id + 1) 
    ORDER BY A.id ASC 
+0

これはid列の存在とその列の値が連続していることを前提としています。 – Strawberry

+0

あなたは@Strawberryを取得できません – Gopalakrishnan

1
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(device INT NOT NULL 
,lat DECIMAL(10,6) NOT NULL 
,lon DECIMAL(10,6) NOT NULL 
,speed DECIMAL(5,2) 
,mode INT NOT NULL 
,dt DATETIME NOT NULL 
,PRIMARY KEY(device,dt) 
); 

INSERT INTO my_table VALUES 
(117,1.415738,103.82360,28.8,3,'2017-07-12 22:07:40'), 
(117,1.424894,103.82561,31.9,3,'2017-07-12 22:08:41'), 
(117,1.429965,103.82674,10.9,3,'2017-07-12 22:09:47'), 
(117,1.430308,103.82873, 5.2,3,'2017-07-12 22:10:47'), 
(117,1.430542,103.83278,13.9,3,'2017-07-12 22:11:48'), 
(117,1.430537,103.83325, 3.2,3,'2017-07-12 22:12:47'); 

SELECT x.* 
    , SEC_TO_TIME(TIME_TO_SEC(x.dt)-TIME_TO_SEC(MAX(y.dt))) diff 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.device = x.device 
    AND y.dt < x.dt 
GROUP 
    BY x.device 
    , x.dt; 
+--------+----------+------------+-------+------+---------------------+----------+ 
| device | lat  | lon  | speed | mode | dt     | diff  | 
+--------+----------+------------+-------+------+---------------------+----------+ 
| 117 | 1.415738 | 103.823600 | 28.80 | 3 | 2017-07-12 22:07:40 | NULL  | 
| 117 | 1.424894 | 103.825610 | 31.90 | 3 | 2017-07-12 22:08:41 | 00:01:01 | 
| 117 | 1.429965 | 103.826740 | 10.90 | 3 | 2017-07-12 22:09:47 | 00:01:06 | 
| 117 | 1.430308 | 103.828730 | 5.20 | 3 | 2017-07-12 22:10:47 | 00:01:00 | 
| 117 | 1.430542 | 103.832780 | 13.90 | 3 | 2017-07-12 22:11:48 | 00:01:01 | 
| 117 | 1.430537 | 103.833250 | 3.20 | 3 | 2017-07-12 22:12:47 | 00:00:59 | 
+--------+----------+------------+-------+------+---------------------+----------+ 
6 rows in set (0.00 sec) 
関連する問題