MySQL UNIX_TIMESTAMP() ガイド
MySQLのUNIX_TIMESTAMP()とFROM_UNIXTIME()によるUnix timestamp操作ガイド。TIMESTAMP型 vs DATETIME型の違いやタイムゾーン処理を解説。
Database
UNIX_TIMESTAMP()
詳細な説明
MySQLはUnix timestampを操作するための組み込み関数を提供しています。UNIX_TIMESTAMP()関数は現在時刻を秒ベースの整数として返し、FROM_UNIXTIME()はtimestampを読みやすい日付に変換します。
主要な関数:
-- 現在のUnix timestampを取得
SELECT UNIX_TIMESTAMP(); -- 1700000000
-- 日付をUnix timestampに変換
SELECT UNIX_TIMESTAMP('2024-01-15 09:30:00'); -- 1705310600
-- Unix timestampを日付に変換
SELECT FROM_UNIXTIME(1700000000); -- '2023-11-14 22:13:20'
-- フォーマット指定付き
SELECT FROM_UNIXTIME(1700000000, '%Y-%m-%d'); -- '2023-11-14'
TIMESTAMP型 vs DATETIME型:
| 特徴 | TIMESTAMP | DATETIME |
|---|---|---|
| ストレージ | 4バイト | 5バイト (MySQL 5.6.4+) |
| 範囲 | 1970-01-01 〜 2038-01-19 | 1000-01-01 〜 9999-12-31 |
| タイムゾーン | UTCで保存、読み取り時に変換 | そのまま保存、変換なし |
| デフォルト | CURRENT_TIMESTAMP設定可能 | 設定可能 (5.6.5+) |
タイムゾーンの動作が最大の違いです。 TIMESTAMPカラムは値をUTCで保存し、取得時にセッションのタイムゾーンに変換します。DATETIMEは挿入した値をそのまま保存し、変換は行いません。つまり、サーバーのタイムゾーンやセッションのtime_zone変数を変更すると、TIMESTAMPカラムから読み取る値は変わりますが、DATETIMEカラムの値は変わりません。
よくある落とし穴:
TIMESTAMP型にはY2038の制限があり、2038年1月19日以降の日付を格納できません。将来の日付(サブスクリプションの有効期限、スケジュールイベントなど)には、代わりにDATETIMEを使用してください。また、UNIX_TIMESTAMP()はTIMESTAMPの範囲外の日付に対してエラーを出す代わりに0を返すため、データが暗黙的に破損する可能性があります。
パフォーマンスのヒント: TIMESTAMPまたはDATETIMEカラムにインデックスを作成すると、範囲クエリで効果的に機能します。外部システムとの互換性のためにUnix timestampを整数として格納する必要がある場合は、BIGINTカラムを使用して2038年問題を回避し、ミリ秒精度の値を格納しましょう。
ユースケース
レガシーアプリケーションの時間カラムをTIMESTAMPからDATETIMEに移行してY2038バグを回避する際、タイムゾーン変換動作の違いを理解することがデータシフトの防止に不可欠です。