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()、およびそれらのシノニムにも適用されます。
とのことでした。