はじめに
オブジェクティブグループの@bachiuekiです!
弊社では月に1回、社内講習会を開いておりまして自分はSQL講習を担当しております。
今回は講習内でも質問が多い、型の使い分けについてのお話です。
データベースで日時を扱うとき、DATETIMEとTIMESTAMPという2つの型がよく使われます。どちらも「年月日と時刻」を保存するための型ですが、実は明確な違いがあり、正しく使い分けることが重要です。
この記事では、それぞれの特徴と具体的な使い分けについて、初心者の方にも分かりやすく解説します。
DATETIME型とは?
DATETIMEは、入力された日時をそのまま保存する 型です。
例えば '2025-08-21 10:00:00' という値を保存したら、そのままの値が記録されます。シンプルで直感的に理解しやすいのが特徴です。
- 特徴: タイムゾーンの情報を持ちません。
- 得意なこと: タイムゾーンに左右されない、普遍的な日時を記録するのに向いています。
どんな時に使う?
- ユーザーの誕生日: 世界のどこにいても同じ日付です。
- イベントの開催日時: 「2026年1月1日 午前9時(日本時間)」のように、基準となる場所が決まっている絶対的な時刻。
- お店の営業時間: 毎日10時開店など、場所に基づいた固定の時刻。
このように、誰がどこから見ても変わらない「絶対的な日時」を記録したい場合にDATETIMEを使いましょう。
TIMESTAMP型とは?
TIMESTAMPは、タイムゾーンを考慮して自動的に変換してくれる型です。
保存時にはデータベースに設定されたタイムゾーン(多くは UTC: 協定世界時)に変換して保存され、
取得時には利用者のタイムゾーンに合わせて再変換して表示されます。
- 特徴: タイムゾーンの情報を考慮して値を変換してくれる。
- 得意なこと: 世界中のユーザーが使うシステムで、それぞれの現地時間に合わせて日時を表示するのに向いています。
どんな時に使う?
-
記事の投稿日時や更新日時 (
created_at,updated_at): 日本のユーザーには日本時間で、アメリカのユーザーにはアメリカ時間で表示したい場合。 - システムの操作ログ: 「いつ、誰が、何をしたか」を記録する際、タイムゾーンが異なると混乱するため、基準となる時刻(UTC)で保存しておくのが一般的です。
世界中の人が利用するWebサービスなど、タイムゾーンを意識する必要がある場合はTIMESTAMPを選ぶと良いでしょう。
比較まとめ
DATETIME |
TIMESTAMP |
|
|---|---|---|
| タイムゾーン | 考慮しない(そのまま保存) | 考慮する(UTCに変換して保存) |
| 値の範囲 | 広い (例: 1000年〜9999年) | 比較的狭い (例: 1970年〜2038年) ※ |
| 用途 | 誕生日、イベント日時など絶対的な時刻 | 投稿日時、更新日時など相対的な時刻 |
※TIMESTAMPの範囲はデータベースのバージョンによって改善されているため、最近のシステムではあまり気にする必要はありません。
結論:どう使い分ける?
シンプルにまとめると、こうなります。
-
タイムゾーンを気にしたくない、絶対的な日時 →
DATETIME -
世界中のユーザーのタイムゾーンを考慮したい →
TIMESTAMP
特に、Webアプリケーションでよく使われるcreated_at(作成日時)やupdated_at(更新日時)のようなカラムには、TIMESTAMPを使うのが一般的です。
おわりに
今回はDATETIMEとTIMESTAMPの違いと使い分けについて解説しました。
日時の扱いはバグの原因になりやすいポイントの一つです。それぞれの型の特徴をしっかり理解して、適切な方を使い分けられるようになりましょう!
オブジェクティブグループではXの投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。