web-dev-qa-db-ja.com

MySQL:2つのタイムスタンプの差を秒単位で取得する方法

MySQLで2つのタイムスタンプの差を数秒で取得できるクエリを作成する方法はありますか、それともPHPで行う必要がありますか?もしそうなら、私はそれをどうやってやるのですか?

84
The.Anti.9

TIMEDIFF() および TIME_TO_SEC() 関数を次のように使用できます。

SELECT TIME_TO_SEC(TIMEDIFF('2010-08-20 12:01:00', '2010-08-20 12:00:00')) diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

また、他の回答で UNIX_TIMESTAMP() 関数を @ Amber推奨 として使用することもできます。

SELECT UNIX_TIMESTAMP('2010-08-20 12:01:00') - 
       UNIX_TIMESTAMP('2010-08-20 12:00:00') diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

TIMESTAMPデータ型を使用している場合、TIMESTAMPの値は既にエポックからの秒数を表す整数として保存されているため、UNIX_TIMESTAMP()ソリューションの方が少し高速になると思います( Source )。 docs の引用:

TIMESTAMPカラムでUNIX_TIMESTAMP()が使用されると、関数は暗黙的な「文字列からUnixタイムスタンプ」への変換なしで、内部タイムスタンプ値を直接返します。

TIMEDIFF()TIMEのデータ型を返す であることに注意してください。 TIME 値の範囲は「-838:59:59」から「838:59:59」までです(約34.96日)

149
Daniel Vassallo

「TIMESTAMPDIFF」はどうですか:

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff

41
David
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

符号なしの差が必要な場合は、式の周りにABS()を追加します。

または、TIMEDIFF(ts1, ts2)を使用し、TIME_TO_SEC()を使用して時間の結果を秒に変換することもできます。

19
Amber

TIMEDIFF()ソリューションは、datetimes5日未満離れている場合にのみ機能することに注意してください。 TIMEDIFF()TIMEデータ型を返し、TIMEの最大値は838:59:59時間(= 34,96日)

9