私はこれを検索しましたが、明確な答えはありません(特に後者について)。どのような場合に日時またはタイムスタンプを使用する必要がありますか?
MS SQL Serverを使用していると仮定します(使用していない場合は、下記の更新を参照してください):
テーブルには、1つのタイムスタンプ列のみを含めることができます。タイムスタンプ列の値は、タイムスタンプ列を含む行が挿入または更新されるたびに更新されます。このプロパティにより、タイムスタンプ列はキー、特に主キーの候補として適切ではありません。行を更新すると、タイムスタンプ値が変更されるため、キー値が変更されます。列が主キーにある場合、古いキー値は無効になり、古い値を参照する外部キーは無効になります。テーブルが動的カーソルで参照されている場合、すべての更新によりカーソル内の行の位置が変更されます。列がインデックスキーにある場合、データ行に対するすべての更新により、インデックスの更新も生成されます。
[〜#〜] msdn [〜#〜] に関する情報
行に対して日付/時刻情報を保存する必要があり、その日付/時刻を変更しない場合は、DateTimeを使用します。それ以外の場合は、タイムスタンプを使用します。
注:MS SQL Serverタイムスタンプフィールドは、日付でも時刻でもありません。データが変更されたときの相対的な順序のバイナリ表現です。
MySQLと言うように更新したように:
TIMESTAMP値は、保存のために現在のタイムゾーンからUTCに変換され、取得のためにUTCから現在のタイムゾーンに変換されます。 (これはTIMESTAMPデータ型でのみ発生し、DATETIMEなどの他の型では発生しません。)
MySQLリファレンス からの引用
より顕著:
TIMESTAMP値を保存してからタイムゾーンを変更して値を取得すると、取得した値は保存した値とは異なります。
そのため、タイムゾーンを越えてアプリケーションを使用しており、個々のユーザー設定を反映する日付/時刻が必要な場合は、タイムスタンプを使用します。タイムゾーンに関係なく一貫性が必要な場合は、Datetimeを使用します
フィールド 'datetime'または 'timestamp'を使用する必要がありますか? を参照してください。トピックに関する包括的な説明があります。
編集-MySQLのプロパティと私の経験を要約するために
タイムスタンプ-
a)列ごとに4バイト(datetimeの8バイトと比較)
b)整数として内部的に保存されます
c)タイムゾーン情報があります!
d)すべてのDATE()/ DAY()/ MONTH()関数は、TIMESTAMPとDATETIMEの両方で機能します
e)MySQLでは、テーブルごとに複数のTIMESTAMPSを持つことができます
f)テーブルの最初のTIMESTAMPは自動的に更新されます...
他の目的で複数のタイムスタンプを使用しました。スペースを節約する必要がありました(非常に注意し、これらすべての問題に留意する必要がありました。
私のアドバイスは、あなたが何をしているのかを知っている場合にのみ、タイムスタンプ以外の目的でTIMESTAMPに行きます。そしてスペースが大きな懸念事項である場合(私の例-15,000,000行と成長し、8つの日時!)
私はあなたの質問をはっきりとは知りませんでしたが、以下のリンクをご覧ください。それはあなたを助けるかもしれません
http://www.sqlteam.com/article/timestamps-vs-datetime-data-types
DateTime
タイプではDATE()
関連の関数を使用できますが、timestamp
では使用できません。Timestamp
は01-01-1970
の前の値を保持できません。私は常にDateTime
を選択する傾向があります。
データベースサーバーを指定する必要があります。
一部のサーバーエンジンはタイムスタンプフィールドを自動的に更新するため、 Optimistic Locking でレコードバージョンとして使用できます。