メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL は日付と時刻の関数を一式提供しています。主に扱う型は、DATE(日付のみ)、TIME(時刻のみ)、DATETIME(日付 + 時刻、タイムゾーンなし)、および TIMESTAMP(日付 + 時刻、UTC で格納され、セッションのタイムゾーンで表示される)です。タイムゾーンの扱いの詳細は、MySQL のタイムスタンプとタイムゾーンを参照してください。

現在の日付と時刻の取得

NOW() はステートメントの開始時に 1 回だけ評価されます。同じ INSERT のすべての行が同じタイムスタンプを得ます。SYSDATE() は呼び出されるたびに評価されます。

日付の書式設定

DATE_FORMAT は、書式文字列を使って日付または日時を文字列に変換します。
よく使う書式指定子:

文字列から日付への解析

STR_TO_DATE は、同じ書式指定子を使って文字列を日付に変換します。
文字列が書式に一致しない場合は NULL を返します。

日付の演算

DATE_ADD / DATE_SUB — 間隔を加算または減算します。
間隔の単位: SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、YEAR。 + と - 演算子による短縮形:
DATEDIFF — 2 つの日付の間の日数です。
DATEDIFF は日数だけを数え、時刻は数えません。時刻を考慮した差分には TIMESTAMPDIFF を使います。
TIMESTAMPDIFF(unit, from, to) — from が to より前に来ることに注意してください。

日付の部分の抽出

EXTRACT / YEAR / MONTH / DAY:
DAYOFWEEK / DAYOFYEAR / WEEK:

期間への切り捨て

データを月、週、または日でグループ化するには、日時を期間の境界に切り捨てます。

Unix タイムスタンプ

よくあるパターン

過去 30 日間のレコード:
今月のレコード:
生年月日からの年齢:

よくある質問

NOW() と SYSDATE() の違いは何ですか?

NOW() は、ステートメントの実行が始まった時点のタイムスタンプを返します。1 つの INSERT または UPDATE のすべての行が同じ値を得ます。SYSDATE() は呼び出された瞬間の実際の時計の時刻を返すため、ループで挿入された行は異なる値を得ます。トランザクション内の一貫性が重要な監査タイムスタンプには、ほぼ常に NOW() が正しい選択です。

INTERVAL 1 MONTH を指定した DATE_ADD が月末で奇妙に振る舞うのはなぜですか?

MySQL は最後の有効な日に丸めます。DATE_ADD('2024-01-31', INTERVAL 1 MONTH) は 2024-02-29(うるう年)または 2024-02-28 を返します。これは想定どおりの動作です。「2 月 31 日」は存在しません。予測可能な月の演算が必要な場合は、先に月の初めに切り捨ててください。

トラブルシューティング

関連項目