めあとるーむ記録帳

なんか書く

MySQLで日付を計算する

SQLで今の時間をとるにはcurrent_timestampを使っていた。べつに問題ないし、どんなふうに出てくるかというと

> SELECT current_timestamp

って打ったらわかる通り。

これを使って動的に今から10分以内であれば~~という比較をすると

> ~ WHERE time_column>current_timestamp '-10 min'

とやっていた。PostgreSQL 8.1.6(すごくふるい)ではこれで通っていた。

が、MySQL 5.7.6で同じ条件を付けると通らなかった。厳密にいうと通るのだが、常にfalse判定されてるらしくtrueで出てきそうな行も出てこなかった。

mysql> select current_timestamp > current_timestamp '-10 min' ;
+---------+
| -10 min |
+---------+
|       0 |
+---------+
1 row in set (0.05 sec)

見た感じだと'-10 min'の記述が悪いらしい。

mysql> select current_timestamp > current_timestamp - 10;
+--------------------------------------------+
| current_timestamp > current_timestamp - 10 |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)

なるほど確かにだ。じゃあ10分というのを変換するにはどうするかと考えたが(上のでは-10秒)

mysql> select current_timestamp > current_timestamp - '0000-00-00 00:10:00';
+---------------------------------------------------------------+
| current_timestamp > current_timestamp - '0000-00-00 00:10:00' |
+---------------------------------------------------------------+
|                                                             0 |
+---------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

あれ。だめだった。 素直に10分を600秒にしてもいいのだがせっかくだしいろいろやってみる。

mysql> select current_timestamp - '0000-00-00 00:10:00' ,current_timestamp;
+-------------------------------------------+---------------------+
| current_timestamp - '0000-00-00 00:10:00' | current_timestamp   |
+-------------------------------------------+---------------------+
|                            20161214152055 | 2016-12-14 15:20:55 |
+-------------------------------------------+---------------------+
1 row in set, 1 warning (0.00 sec)

時間が変わってないところを見るとそもそも引き算の対象としてはとれないらしい。Warningにもそう書いてある( Truncated incorrect DOUBLE value: '0000-00-00 00:10:00' とのこと)

mysql> select current_timestamp - 00:10:00 ,current_timestamp;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':10:00 ,current_timestamp' at line 1
mysql> select current_timestamp - 00-00-00 00:10:00 ,current_timestamp;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '00:10:00 ,current_timestamp' at line 1

うーん、素直に600秒で引き算するのが一番楽そうだ

mysql> select current_timestamp - 600 ,current_timestamp, current_timestamp>current_timestamp-600;
+-------------------------+---------------------+-----------------------------------------+
| current_timestamp - 600 | current_timestamp   | current_timestamp>current_timestamp-600 |
+-------------------------+---------------------+-----------------------------------------+
|          20161214153421 | 2016-12-14 15:40:21 |                                       1 |
+-------------------------+---------------------+-----------------------------------------+
1 row in set (0.01 sec)

あれ?6分で引かれてる?

mysql> select current_timestamp - 10000 ,current_timestamp;
+---------------------------+---------------------+
| current_timestamp - 10000 | current_timestamp   |
+---------------------------+---------------------+
|            20161214144353 | 2016-12-14 15:43:53 |
+---------------------------+---------------------+
1 row in set (0.00 sec)

つまり、下から2桁を秒、下から3,4桁を分、という風に扱ってるらしい。

まさかこんな仕様だとは思ってなかった