DataBase MySQL

MySQLの時間の計算・比較

投稿日:2013年5月25日 更新日:

列同士を比較する

datetime型をそのままプラス・マイナスしてはいけません!!

例えば、

mysql> select * from test;
+---------------------+---------------------+
| start               | end                 |
+---------------------+---------------------+
| 2013-05-16 11:59:48 | 2013-05-16 12:00:31 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> select end - start from test;
+-------------+
| end - start |
+-------------+
| 4083.000000 |
+-------------+
1 row in set (0.00 sec)

恐らく普通に考えて想定される結果は、43秒なのではないでしょうか?
なぜ4083になるかというと、
2013-05-16 12:00:31 は 20130516120031
2013-05-16 11:59:48 は 20130516115948
そのため
20130516120031 - 20130516115948 = 4083
となっているためです。
この結果は誰も求めていはいないはずです。

時間の差分を求める場合には、必ずtimediff関数を使用しましょう。

mysql> select timediff(end,start) from test;
+---------------------+
| timediff(end,start) |
+---------------------+
| 00:00:43            |
+---------------------+
1 row in set (0.01 sec)

さらに時間を秒に直したい場合には、time_to_secを使用しましょう。

mysql> select time_to_sec(timediff(end,start)) from test;
+----------------------------------+
| time_to_sec(timediff(end,start)) |
+----------------------------------+
|                               43 |
+----------------------------------+
1 row in set (0.00 sec)

timediffを使用しなければ、時間や日付をまたいだ場合に思わぬ結果になってしまいます!!

特定の時間を加減算する

列同士の比較にはtimediff関数でしたが、
指定した時間を加減算する場合にはaddtimeを使用します。

下記は10分前を求めている例です。

mysql> select now(),addtime(now(),'-00:10:00');
+---------------------+----------------------------+
| now()               | addtime(now(),'-00:10:00') |
+---------------------+----------------------------+
| 2013-05-17 06:13:49 | 2013-05-17 06:03:49        |
+---------------------+----------------------------+
1 row in set (0.00 sec)

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, MySQL

執筆者:

関連記事

mysql

MySQLのバイナリログを見てスレーブ停止の原因を調査する

以前スレーブ側の更新がとまっていることに気付きました :x001: その時のトラブルシューティングの手順です。 INDEX1 1.スレーブ側で、SlaveS tatusを確認する2 2.スレーブ側のロ …

mysql

MySQL ERROR: Can’t connect to MySQL server on ‘xxx.xxx.x.xx’ (13)

MySQL ERROR: Can’t connect to MySQL server on ‘xxx.xxx.xxx.xxx’ (13) はSELinuxによる接続 …

select insert

私は以前SQLの順番にinsert selectと呼んでいて、笑われたことがあります。 select insertだ!と当時の上司に言われました。 なるほど、副問い合わせのselectが実行されて、そ …

mysql

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

ダンプをインポートしようとすると下記エラーが表示されてインポートできませんでした。 [root@centos]# mysql -u root -p reset master; するとインポートできまし …

sqlserver

「.NET」と「ASP.NET」からのSQL Serverへのコネクションを確認する(1)

INDEX1 コネクション数と状態を確認する2 コネクションプールとは3 コネクションを制御する設定 コネクション数と状態を確認する SQLSERVERのコネクション数を確認するには下記のSQLを実行 …