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

執筆者:

関連記事

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 サービス起動用ユーザーを作成する

SQLサーバーのサービスを起動しているのは、デフォルトではおそらくAdministratorです。 ここに大きな落とし穴があります。 Administratroのパスワードを変更することはセキュリティ …

sqlserver

SQL Server 構成マネージャーを起動する

SQL Server 構成マネージャーがない。 何故か、コンピューターの管理の中に入っていた。 また検索窓からは以下のように検索できる。 ・SQL Server 2014 の場合   SQLServe …

sqlserver

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

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

mysql

MySQLにファイルからSQLを読み込む

MySQLにファイルからSQLを読み込む方法は 意外と知られていない方法ですのでメモっておきます。 INDEX1 MySQLにログイン中の場合2 スクリプトから実行する場合3 おまけのコマンドで指定す …