猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

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

執筆者:

関連記事

sqlserver

SQL Server Management Studio の「上位200行の編集」を変更したい

恐らく私が十分に使用できていないだけで、機能はたくさんありそうなSQL Server Management Studio。最近新しいものに入れ替えたら(OS毎再インストールするハメになったのですが)、 …

mysql

utilitiesのmysqlfailoverを使う(2)

前回の utilitiesのmysqlfailoverを使う(1)で設定・起動は完了しています。 私の目的は2台のMySQLサーバーを定期的に入れ替えてメンテナンスすることです。 今回はマスターがダウ …

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による接続 …

sqlserver

SQL Server Browser を起動する方法

SQL Server構成マネージャーより起動できるはずが、なぜか開始も停止もできない。 コントロール パネル > システムとセキュリティ > 管理ツール > サービス を見ると、SQL Server …

mysql

MySQLが起動できない

エラーログには下記ログが大量に出力されて起動できない・・・。 2013-08-22 17:32:10 30137 [ERROR] InnoDB: Unable to lock ./ibdata1, e …