SQLでは、データベース操作において現在の日付や時刻を取得するための関数が用意されています。特にMySQLでは、CURDATE()とNOW()という二つの関数がよく使われます。これらの関数を使用することで、現在の日付や時刻を簡単に取得でき、データの記録や管理に役立てることができます。本記事では、これらの関数の使用方法とそれぞれの違いについて詳しく解説します。
本記事はMySQL向けです。CURDATE()とNOW()は接続セッションのタイムゾーンを基準にします。NOW()は文の実行開始時点の値で、同じ文の中では一定です。日付がずれる場合はSELECT @@session.time_zone, CURDATE(), NOW();で確認し、保存列の時刻基準と合わせてください。以下の2024年の出力は説明用の例で、実行結果は実行日時によって変わります。INSERTとUPDATEは実データを変更するため、例を本番へそのまま流さないでください。
CURDATE()関数の使用方法
CURDATE()関数は、現在の日付を取得するためのMySQLの組み込み関数です。この関数は、年、月、日の情報のみを返し、時刻情報は含まれません。以下に、CURDATE()関数の基本的な使い方を示します。
基本的な使用例
現在の日付を取得するには、次のようにSQLクエリを実行します。
SELECT CURDATE();このクエリを実行すると、今日の日付がYYYY-MM-DD形式で返されます。例えば、2024年5月24日にこのクエリを実行すると、結果は次のようになります。
+------------+
| CURDATE() |
+------------+
| 2024-05-24 |
+------------+応用例:テーブルに現在の日付を挿入
CURDATE()関数を使用して、テーブルに現在の日付を挿入することもできます。以下の例では、ordersテーブルに新しい注文を挿入し、その注文の日付として現在の日付を設定しています。
INSERT INTO orders (order_date, customer_id, product_id, quantity)
VALUES (CURDATE(), 12345, 67890, 1);このクエリを実行すると、ordersテーブルに新しい行が追加され、そのorder_dateフィールドには現在の日付が挿入されます。
NOW()関数の使用方法
NOW()関数は、現在の日付と時刻を取得するためのMySQLの組み込み関数です。この関数は、年、月、日だけでなく、時、分、秒の情報も含めたタイムスタンプを返します。以下に、NOW()関数の基本的な使い方を示します。
基本的な使用例
現在の日付と時刻を取得するには、次のようにSQLクエリを実行します。
SELECT NOW();このクエリを実行すると、現在のタイムスタンプがYYYY-MM-DD HH:MM:SS形式で返されます。例えば、2024年5月24日の午後2時30分45秒にこのクエリを実行すると、結果は次のようになります。
+---------------------+
| NOW() |
+---------------------+
| 2024-05-24 14:30:45 |
+---------------------+応用例:テーブルに現在のタイムスタンプを挿入
NOW()関数を使用して、テーブルに現在のタイムスタンプを挿入することもできます。以下の例では、login_attemptsテーブルに新しいログイン試行を挿入し、その試行のタイムスタンプとして現在の日時を設定しています。
INSERT INTO login_attempts (user_id, attempt_time, status)
VALUES (12345, NOW(), 'SUCCESS');このクエリを実行すると、login_attemptsテーブルに新しい行が追加され、そのattempt_timeフィールドには現在のタイムスタンプが挿入されます。
CURDATE()とNOW()の違い
CURDATE()とNOW()はどちらも現在の日時情報を取得するための関数ですが、それぞれが返す情報には明確な違いがあります。これらの違いを理解することで、適切な関数を選択して使用することができます。
CURDATE()の特徴
CURDATE()は現在の日付のみを取得する関数です。この関数は時刻情報を含まず、YYYY-MM-DD形式で日付を返します。例えば、システムの日付を必要とするレポート作成や、日付に基づいたフィルタリングを行う場合に適しています。
使用例
SELECT CURDATE();結果:
+------------+
| CURDATE() |
+------------+
| 2024-05-24 |
+------------+NOW()の特徴
NOW()は現在の日付と時刻を取得する関数です。この関数はタイムスタンプを返し、YYYY-MM-DD HH:MM:SS形式で日付と時刻の両方を含みます。ログエントリの作成や、時間単位でのデータ管理が必要な場合に適しています。
使用例
SELECT NOW();結果:
+---------------------+
| NOW() |
+---------------------+
| 2024-05-24 14:30:45 |
+---------------------+使用シーンに応じた使い分け
- CURDATE()の使用例: 日付のみを扱う場合。例えば、特定の日付に発生したイベントを抽出するクエリや、日付を基準にした集計を行う場合。
- NOW()の使用例: 日付と時刻の両方を扱う場合。例えば、ログの記録、タイムスタンプを必要とするデータの挿入、更新の日時管理など。
CURDATE()とNOW()を使い分けることで、必要な情報に応じた正確なデータ取得が可能になります。
SQLクエリの実例
ここでは、CURDATE()とNOW()関数を使用した具体的なSQLクエリの実例を紹介します。それぞれの関数がどのような結果を返すか、実際の使用方法を見ていきましょう。
現在の日付を取得するクエリ
CURDATE()関数を使用して、現在の日付を取得するクエリは次の通りです。
SELECT CURDATE();このクエリを実行すると、今日の日付がYYYY-MM-DD形式で返されます。例えば、結果は次のようになります。
+------------+
| CURDATE() |
+------------+
| 2024-05-24 |
+------------+現在の日付と時刻を取得するクエリ
NOW()関数を使用して、現在の日付と時刻を取得するクエリは次の通りです。
SELECT NOW();このクエリを実行すると、現在のタイムスタンプがYYYY-MM-DD HH:MM:SS形式で返されます。例えば、結果は次のようになります。
+---------------------+
| NOW() |
+---------------------+
| 2024-05-24 14:30:45 |
+---------------------+テーブルに現在の日付を挿入するクエリ
CURDATE()関数を使用して、テーブルに現在の日付を挿入するクエリは次の通りです。
INSERT INTO daily_reports (report_date, report_content)
VALUES (CURDATE(), 'Daily sales report content');このクエリを実行すると、daily_reportsテーブルに新しい行が追加され、そのreport_dateフィールドには現在の日付が挿入されます。
テーブルに現在のタイムスタンプを挿入するクエリ
NOW()関数を使用して、テーブルに現在のタイムスタンプを挿入するクエリは次の通りです。
INSERT INTO event_logs (event_time, event_description)
VALUES (NOW(), 'User login event');このクエリを実行すると、event_logsテーブルに新しい行が追加され、そのevent_timeフィールドには現在のタイムスタンプが挿入されます。
これらの実例を通じて、CURDATE()とNOW()関数の具体的な使用方法とその結果が理解できるようになります。これにより、日付や時刻を必要とする様々なデータベース操作を効率的に行うことができます。
応用例
CURDATE()とNOW()関数を使って、現在の日付や時刻を用いた実用的なクエリをいくつか紹介します。これらのクエリは、日付や時刻を活用した高度なデータ操作や分析に役立ちます。
今日を含む7暦日のデータを取得するクエリ
ここでは今日を含む7暦日を対象とし、6日前の午前0時以上、明日の午前0時未満を抽出します。直近168時間とは異なります。
SELECT * FROM orders
WHERE order_date >= CURDATE() - INTERVAL 6 DAY
AND order_date < CURDATE() + INTERVAL 1 DAY;この例は今日の日中・今夜の行も含む7暦日の範囲です。現在時刻より先を含めたくない場合は、日時列の上限をNOW()にします。直近168時間を求めるなら、保存する時刻の基準を確認してNOW() – INTERVAL 7 DAY以上かつNOW()未満などと定義します。
特定の日付のレコードを取得するクエリ
特定の日付のレコードを取得するためには、CURDATE()関数を使用して条件を指定します。
SELECT * FROM events
WHERE event_date >= CURDATE()
AND event_date < CURDATE() + INTERVAL 1 DAY;DATETIMEなど時刻を含む列でも、今日の午前0時以上から明日の午前0時未満まで取得できます。event_date = CURDATE()で今日全体を扱えるのはDATE型など日付だけを保存している場合で、日時列では日中の行が漏れます。
過去1時間のログイン試行を取得するクエリ
過去1時間に発生したログイン試行を取得するためには、NOW()関数を使用して現在の時刻を基準に時刻を計算します。
SELECT * FROM login_attempts
WHERE attempt_time >= NOW() - INTERVAL 1 HOUR
AND attempt_time < NOW();このクエリは、login_attemptsテーブルから過去1時間に発生した全てのログイン試行を抽出します。
明示的なUPDATEで現在日時を書き込むクエリ
レコードの更新時に現在のタイムスタンプを使用するためには、NOW()関数を使用します。
UPDATE users
SET last_login = NOW()
WHERE user_id = 12345;このUPDATEを実行した時点で対象行を書き換えます。自動実行を登録するものではありません。対象のuser_idをSELECTで確認し、検証用データで試してください。
月初から今日までの売上を集計するクエリ
月初から今日までの売上を集計するためには、CURDATE()関数を使用して月初の日付を計算します。
SELECT SUM(sales_amount) FROM sales
WHERE sale_date >= DATE_FORMAT(CURDATE() ,'%Y-%m-01') AND sale_date < CURDATE() + INTERVAL 1 DAY;今月の初日から今日の日中を含み、明日の午前0時は除外します。日時列に<= CURDATE()を使うと今日の午前0時を超える行が漏れます。現在時刻までで集計する要件なら上限をNOW()にし、未来の予定売上を含めないよう区別します。
これらの応用例を通じて、CURDATE()とNOW()関数を使った高度なクエリの作成方法が理解できるようになります。これにより、日付や時刻に基づいた多様なデータ操作や分析を効率的に行うことができます。
まとめ
CURDATE()とNOW()関数は、MySQLにおいて現在の日付や時刻を取得するための強力なツールです。CURDATE()は日付のみを返し、主に日付ベースの操作に適しています。一方、NOW()はタイムスタンプを返し、時刻情報が必要な場合に有用です。これらの関数を適切に使い分けることで、データの記録や管理、分析を効率的に行うことができます。この記事で紹介した基本的な使い方や応用例を参考に、日付や時刻を活用した高度なSQLクエリを作成してみてください。
公式仕様:MySQLの日付・時刻関数。


コメント