私の経験では、プログラミング時に日付/時刻を正しく取得することは、常に危険と困難を伴います。
Ruby と Rails は、選択肢が多すぎてどれを選べばいいのかまったくわからないため、これまでずっと迷っていました。
Railsを使用してActiveRecordのデータ型を見ると、次のようなことがわかります。
:datetime、:timestamp、:time、および :date
違いが何なのか、どこに落とし穴があるのか全く分かりません。
違いは何ですか?何に使いますか?
(追記: Rails3 を使用しています)
ベストアンサー1
ActiveRecord のさまざまな日付/時刻形式の違いは、Rails とはほとんど関係がなく、使用しているデータベースにすべて関係します。
MySQL を例に挙げると (他の理由がない限り、最も人気があるからです)、、、および の列データ型がありますDATE
。またDATETIME
、、、およびもあります。TIME
TIMESTAMP
CHAR
VARCHAR
FLOAT
INTEGER
では、違いは何かと疑問に思うかもしれません。いくつかは説明不要です。DATE
は日付のみを保存し、TIME
は時刻のみを保存しますが、 はDATETIME
両方を保存します。
DATETIME
との違いはTIMESTAMP
もう少し微妙です。DATETIME
は としてフォーマットされますYYYY-MM-DD HH:MM:SS
。有効な範囲は 1000 年から 9999 年までです (その間のすべて)。データベースから取得すると は似ていますがTIMESTAMP
、実際には の単なる前置きです。UNIXタイムスタンプ有効範囲は 1970 年から 2038 年です。データベース エンジン内のさまざまな組み込み関数とは別に、ここでの違いはストレージ スペースです。 はDATETIME
年、月、日、時、分、秒のすべての桁を格納するため、合計 8 バイトを使用します。 はTIMESTAMP
1970-01-01 からの秒数のみを格納するため、4 バイトを使用します。
MySQLの時刻形式の違いについて詳しくはこちらをご覧ください。ここ。
結局のところ、日付/時刻列に何を実行する必要があるかが重要になります。
- 1970 年以前、または 2038 年以降の日付と時刻を保存する必要がありますか? => を使用します
DATETIME
。 - データベースのサイズを気にする必要があり、その時間範囲内ですか? => を使用します
TIMESTAMP
。 - 日付のみを保存する必要がありますか? => を使用します
DATE
。 - 時間だけを保存する必要がありますか? => を使用します
TIME
。
とはいえ、実際には Rails がこれらの決定の一部を行います。:timestamp
と は両方ともが:datetime
デフォルトとなりDATETIME
、と はそれぞれと に対応します。:date
:time
DATE
TIME
つまり、Rails 内では、日付、時刻、またはその両方を保存する必要があるかどうかを決定するだけで済みます。