at backyard

Color my life with the chaos of trouble.

MySQLで時刻や日付の差分を取得する方法 (TIMEDIFFやDATEDIFFの使い方)

MySQLでTIMEDIFFやDATEDIFFを用いて、時刻や日付の差分を取得する

MySQLで時刻や日付の差分を取得するには TIMEDIFFDATEDIFF が使える。

基本的な使い方を下記にメモした。
一応現在接続している自身のMySQLのversionはこちら。

select version();
# ⇒ 5.7.21

なお、MySQLは、dockerで立てたMySQL にローカルPCから接続している(余談)。
そういえば昔、そんな備忘録もちょこっと書いたなと思ったので、自分自身が思い出すために貼っておく。

mac上のDockerに立ち上げたmysqlに、host(mac)から接続する - at backyard

TIMEDIFFを使ってMySQLで時刻の差分を取得する

第1引数 - 第2引数という形で計算されるので注意
使い方は下記の通り。

SELECT TIMEDIFF('2000:01:01 00:10:00','2000:01:01 00:00:00');
# ⇒ 00:10:00

SELECT TIMEDIFF('2000:01:01 00:00:00','2000:01:01 00:10:00');
# ⇒ -00:10:00

SELECT TIMEDIFF('2000/01/02 00:00:00','2000/01/01 23:59:59');
# ⇒ 00:00:01

あくまで時刻の差分となるため、1日以上離れている場合でも時間で算出される。

SELECT TIMEDIFF('2000/02/01 00:00:00','2000/01/01 23:59:59');
# ⇒ 720:00:01

時刻の記述は異なっていても、それが正しい値であればちゃんと計測されるよう。

SELECT TIMEDIFF('2000:01:01 00:10:00','2000/01/01 00/00/00');
# ⇒ 00:10:00

日付と時刻の比較はできないようで NULL が返る

SELECT TIMEDIFF('2000:01:01 00:01:00','2000:01:01');
# ⇒ NULL

また、正しくない時刻の場合も NULL が返る。

SELECT TIMEDIFF('2000:01:01 00:00:00','2000:01:01 24:60:00');
# ⇒ NULL

SELECT TIMEDIFF('2000:01:01 00:00:00','2000:13:01 00:00:00');
# ⇒ NULL

DATEDIFFを使ってMySQLで日付の差分を取得する

DATEDIFFは日付の差分を算出する。
こちらも第1引数 - 第2引数という形で計算される。

SELECT DATEDIFF('2000:01:02','2000:01:01');
# ⇒ 1

SELECT DATEDIFF('2000/01/02','2000/01/01');
# ⇒ 1

SELECT DATEDIFF('2000/01/02','2001/01/01');
# ⇒ 365

SELECT DATEDIFF('2000:01:02','2020:1:1');
# ⇒ -7304

DATEDIFFはあくまで日付の比較となるため、仮に時刻を含む値で比較した場合でも日付自体に差異が出ていれば計算される。

SELECT DATEDIFF('2000:01:02 00:00:00','2000:01:01 23:59:59');
# ⇒ 1

SELECT DATEDIFF('2000:01:01 00:00:00','2000:01:01 23:59:59');
# ⇒ 0

また、日付と時刻の比較も可能。
(時刻自体は無視されて比較されているよう)

SELECT DATEDIFF('2000/01/02','2000/01/01 23:59:59');
# ⇒ 1

SELECT DATEDIFF('2000/01/01','2000/01/01 23:59:59');
# ⇒ 0

こちらも正しくない値を渡すと NULL が返る

SELECT DATEDIFF('2000:01:02','2000:02:31');
# ⇒ NULL

SELECT DATEDIFF('2000:01:02','23:59:59');
# ⇒ NULL

MySQLのTIMEDIFFを用いて、開始から終了までの時間が短い順にレコードを表示していく

これらの関数を用いれば、例えば開始時刻から終了時刻までの経過時間が短い順にレコードを表示するようなことができる。
(ここでは時刻の差分を取得するためにTIEMDIFFを使用)

SELECT
  id,
  TIMEDIFF(endDateTime, startDateTime) as "開始から終了までにかかった時間”
FROM
  table_name
ORDER BY TIMEDIFF(endDateTime, startDateTime) ASC;