web-dev-qa-db-ja.com

日時またはタイムスタンプを使用する場合

私はこれを検索しましたが、明確な答えはありません(特に後者について)。どのような場合に日時またはタイムスタンプを使用する必要がありますか?

68
James P.

MS SQL Serverを使用していると仮定します(使用していない場合は、下記の更新を参照してください):

テーブルには、1つのタイムスタンプ列のみを含めることができます。タイムスタンプ列の値は、タイムスタンプ列を含む行が挿入または更新されるたびに更新されます。このプロパティにより、タイムスタンプ列はキー、特に主キーの候補として適切ではありません。行を更新すると、タイムスタンプ値が変更されるため、キー値が変更されます。列が主キーにある場合、古いキー値は無効になり、古い値を参照する外部キーは無効になります。テーブルが動的カーソルで参照されている場合、すべての更新によりカーソル内の行の位置が変更されます。列がインデックスキーにある場合、データ行に対するすべての更新により、インデックスの更新も生成されます。

[〜#〜] msdn [〜#〜] に関する情報

行に対して日付/時刻情報を保存する必要があり、その日付/時刻を変更しない場合は、DateTimeを使用します。それ以外の場合は、タイムスタンプを使用します。

注:MS SQL Serverタイムスタンプフィールドは、日付でも時刻でもありません。データが変更されたときの相対的な順序のバイナリ表現です。

更新

MySQLと言うように更新したように:

TIMESTAMP値は、保存のために現在のタイムゾーンからUTCに変換され、取得のためにUTCから現在のタイムゾーンに変換されます。 (これはTIMESTAMPデータ型でのみ発生し、DATETIMEなどの他の型では発生しません。)

MySQLリファレンス からの引用

より顕著:

TIMESTAMP値を保存してからタイムゾーンを変更して値を取得すると、取得した値は保存した値とは異なります。

そのため、タイムゾーンを越えてアプリケーションを使用しており、個々のユーザー設定を反映する日付/時刻が必要な場合は、タイムスタンプを使用します。タイムゾーンに関係なく一貫性が必要な場合は、Datetimeを使用します

66
Jaymz

フィールド 'datetime'または 'timestamp'を使用する必要がありますか? を参照してください。トピックに関する包括的な説明があります。

編集-MySQLのプロパティと私の経験を要約するために

タイムスタンプ-

a)列ごとに4バイト(datetimeの8バイトと比較)

  • 下限( '1970-01-01 00:00:01' UTCから '2038-01-09 03:14:07' UTC)日時より-誕生日などには絶対に使用しないでください。ほとんどの使用パターンは実際には、行の更新などのアクティビティに「NOW」の「Timestamp」を提供します。

b)整数として内部的に保存されます

  • パフォーマンスに関しては...私の個人的な経験は曖昧です。ただし、必要なスペースは少なくなります。

c)タイムゾーン情報があります!

  • だから-タイムスタンプに「2011-01-01 3:30」を追加すると(現在のタイムゾーンはEST-ボストン)..後で、サーバーとmysqlのタイムゾーンをPSTに変更してサーバーを再起動します-値が変更されます「2011-01-01 00:00」に-(確認してください...私はずっと前にこれをテストしていました)。ただし、DATETIMEは変わりません。

d)すべてのDATE()/ DAY()/ MONTH()関数は、TIMESTAMPとDATETIMEの両方で機能します

e)MySQLでは、テーブルごとに複数のTIMESTAMPSを持つことができます

  • (はい、ただし、行の更新時に自動的に更新されるのはそのうちの1つ(最初の)だけです。また、NOT NULLにできるのは1つだけです(最初のことを考えてください))

f)テーブルの最初のTIMESTAMPは自動的に更新されます...

  • そのため、他の目的で使用する場合は注意してください。nullを許可する必要があります。 (DATETIMEとTIMESTAMPの両方で「0000-00-00 00:00:00」としてNULLが格納されます)

他の目的で複数のタイムスタンプを使用しました。スペースを節約する必要がありました(非常に注意し、これらすべての問題に留意する必要がありました。

私のアドバイスは、あなたが何をしているのかを知っている場合にのみ、タイムスタンプ以外の目的でTIMESTAMPに行きます。そしてスペースが大きな懸念事項である場合(私の例-15,000,000行と成長し、8つの日時!)

30
Jai

私はあなたの質問をはっきりとは知りませんでしたが、以下のリンクをご覧ください。それはあなたを助けるかもしれません

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

5
  • MySQLでは、DateTimeタイプではDATE()関連の関数を使用できますが、timestampでは使用できません。
  • Timestamp01-01-1970の前の値を保持できません。
  • また、そのうちの1つは夏時間を保持し、他の1つは保持しません(現在どれを覚えていないのですか)

私は常にDateTimeを選択する傾向があります。

2

データベースサーバーを指定する必要があります。

一部のサーバーエンジンはタイムスタンプフィールドを自動的に更新するため、 Optimistic Locking でレコードバージョンとして使用できます。

2
sehe