猫型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

SQLSERVER saでログインできるようにする

私はsaも設定しておくべきだと思います。 そこでsaログインするための確認ポイントです。 INDEX1 ログインを有効にする2 サーバー認証の設定3 名前付きパイプ ログインを有効にする Manage …

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

SQLSERVER「Login failed for user ‘xxxxxxx’. 理由: 指定された名前に一致するログインが見つかりませんでした」

Windows認証でAdministratorを指定しているのにログインできない。 そんな場合は以下の手順でAdministratorユーザーを作成します。 INDEX1 起動時のパラメーターの変更2 …

mysql

MySQL load dataでcsvをインサートする

かなり高速でinsertしてくれます。 INDEX1 使い方2 ERROR 10453 [補足]insertを高速にする 使い方 MySQLにログインして、データベースを指定して実行します。 mysq …

mysql

CentOS6.4にMySQL5.6をインストールする

INDEX1 RPMのダウンロード2 tarの解凍3 rpmをyumでインストール4 サービス名が違う?5 mysql_secretにrootの初期パスワードはある6 mysql_secure_ins …