本ブログは移転しました。新しいブログは こちら です。

MySQLのNOW()とSYSDATE()の違いについて

NOW()とSYSDATE()の違い

公式ドキュメント(5.6)によると、

NOW()は、

現在の日付または時間をそれぞれ返す関数は、クエリー実行の開始時にクエリーごとに 1 回だけ評価されます。 つまり、NOW() などの関数が単一クエリー内で複数回参照されても、常に同じ結果が生成されます。

なのに対し、SYSDATE()は、

SYSDATE() は、実行された時間を返します。 これは、ステートメントが実行を開始する時間を示す定数時間を返す NOW() の動作とは異なります。

とのこと。

なお、公式ドキュメント(8.0)にも同様の記載があり、バージョンが上がってもこの性質は受け継がれている模様。

実際に動かしてみる

NOW()

mysql> SELECT NOW(6) as now1, NOW(6) as now2;
 ---------------------------- ---------------------------- 
| now1                       | now2                       |
 ---------------------------- ---------------------------- 
| 2019-04-23 22:49:39.443339 | 2019-04-23 22:49:39.443339 |
 ---------------------------- ---------------------------- 

SYSDATE()

mysql> SELECT SYSDATE(6) as sys1, SYSDATE(6) as sys2;
 ---------------------------- ---------------------------- 
| sys1                       | sys2                       |
 ---------------------------- ---------------------------- 
| 2019-04-23 23:10:29.857604 | 2019-04-23 23:10:29.857622 |
 ---------------------------- ---------------------------- 

となり、あたり前だがドキュメントの記載通りの動きをしている。

他の日付関数はどうなのか

つまり、NOW() などの関数が単一クエリー内で複数回参照されても、常に同じ結果が生成されます。 …中略… この原則は、CURDATE()、CURTIME()、UTC_DATE()、UTC_TIME()、UTC_TIMESTAMP()、およびそれらのシノニムにも適用されます。

とのことでした。

Contents