MySQLのNOW()とSYSDATE()の違いとは?実行時刻の挙動をわかりやすく解説
MySQLにおけるNOW()とSYSDATE()の基本的な違い
MySQLには、現在の日付と時刻(タイムスタンプ)を取得するための関数として、NOW()とSYSDATE()の2つが用意されています。どちらも一見同じように見えますが、実際の出力結果はステートメントの実行タイミングによって大きく異なります。この違いを理解することは、正確な時刻処理を行う上で非常に重要です。
NOW()の特徴:ステートメント開始時刻を返す
NOW()関数は、そのステートメントが実行を開始した時点の時刻を返します。つまり、クエリの実行中に時間が経過しても、常に同じ値(一定の時刻)を返すのが特徴です。
一方、SYSDATE()関数は、そのステートメントが実際に実行された瞬間の時刻を返します。そのため、実行中に時間が経過すれば、それに応じた最新の時刻が返されます。
NOW()の動作を確認するサンプル
以下の例では、SLEEP(5)を使って5秒間処理を停止させ、前後でNOW()の戻り値を比較しています。
mysql> Select NOW(), SLEEP(5), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(5) | NOW() | +---------------------+----------+---------------------+ | 2017-10-31 09:57:36 | 0 | 2017-10-31 09:57:36 | +---------------------+----------+---------------------+ 1 row in set (5.11 sec)
この結果を見ると、システムが5秒間スリープしたにもかかわらず、最初と最後のNOW()はまったく同じ時刻を返しています。これは、NOW()が「ステートメントの実行開始時刻」を基準としているためです。
SYSDATE()の動作を確認するサンプル
次に、同じ条件でSYSDATE()を実行してみます。
mysql> Select SYSDATE(), SLEEP(5), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(5) | SYSDATE() | +---------------------+----------+---------------------+ | 2017-10-31 09:58:13 | 0 | 2017-10-31 09:58:18 | +---------------------+----------+---------------------+ 1 row in set (5.00 sec)
こちらの結果では、5秒間のスリープ後に実行された2回目のSYSDATE()は、最初の値からちょうど5秒進んだ時刻(09:58:18)を返しています。これが、SYSDATE()が「実際に実行された瞬間の時刻」を返すことの証明です。
使い分けのポイント
- NOW():トランザクションやログ記録など、同一ステートメント内で一貫した時刻が必要な場合に適しています。
- SYSDATE():バッチ処理の経過時間計測など、リアルタイムの現在時刻が必要な場合に適しています。
なお、レプリケーション環境ではSYSDATE()はマスターとスレーブで異なる時刻を返す可能性があるため、注意して使用してください。この点でも、通常はNOW()の方が安全な選択と言えます。
-
MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?
結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (