web-dev-qa-db-ja.com

Ruby on Railsでは、DateTime、Timestamp、Time、Dateの違いは何ですか?

私の経験では、プログラミング時に日付/時刻を正しく取得することは常に危険と困難をはらんでいます。

RubyとRailsは、圧倒的な数の選択肢があるからといって、いつもこれを避けてきました。私は私が選ぶべきアイデアがありません。

私がRailsを使っていてActiveRecordのデータ型を見ると、私は以下のものを見つけることができます。

:datetime、:timestamp、:time、および:date

そして何が違うのか、どこにゴチャが潜んでいるのかわかりません。

違いは何ですか?何に使うのですか?

(P.S:私はRailsを使っています3)

394
Nick May

ActiveRecordのさまざまな日付/時刻フォーマットの違いは、Railsとほとんど関係がなく、使用しているデータベースに関係がありません。

MySQLを例として使用します(最も一般的であるために他に理由がない場合)、DATEname__、DATETIMEname__、TIMEname__、およびTIMESTAMPname__の列データ型があります。 CHARname__、VARCHARname__、FLOATname__およびINTEGERname__があるように。

それで、あなたは尋ねます、違いは何ですか?まあ、それらのいくつかは自明です。 DATEname__は日付のみを格納し、TIMEname__は時刻のみを格納し、DATETIMEname__は両方を格納します。

DATETIMEname__とTIMESTAMPname__の違いはもう少し微妙です。DATETIMEname__はYYYY-MM-DD HH:MM:SSとしてフォーマットされます。有効範囲は1000年から9999年まで(およびその間のすべてです。データベースから取得する場合、TIMESTAMPname__に似ていますが、実際には単なる前線です。 nix timestamp 。その有効範囲は1970年から2038年です。ここでの違いは、データベースエンジン内のさまざまな組み込み関数を除いて、記憶域です。DATETIMEname__は、年、月日の各桁を格納するためです。 TIMESTAMPname__は、1970年1月1日からの秒数のみを格納するため、4バイトを使用します。

MySQLの時間フォーマットの違いについてもっと読むことができます ここ

結局、それはあなたがあなたの日付/時刻列をするのに必要なものに帰着します。 1970年以前または2038年以降の日付と時刻を保存する必要がありますか? DATETIMEname__を使用してください。データベースのサイズを気にする必要はありますか。その期間内ですか? TIMESTAMPname__を使用してください。あなただけの日付を保存する必要がありますか? DATEname__を使用してください。あなただけの時間を保存する必要がありますか? TIMEname__を使用してください。

これをすべて言ったので、Railsは実際にこれらの決定のいくつかをあなたのために行います:timestamp:datetimeは両方ともデフォルトでDATETIMEname__になりますが、:date:timeはそれぞれDATEname__とTIMEname__に対応します。

つまり、Rails内では、日付、時刻、またはその両方を保存する必要があるかどうかを判断するだけで済みます。

546
vonconrad
  1. :日時(8バイト)

    • 日付と時刻の形式YYYY-MM-DD HH:MM:SS
    • Birth_dateのような列に役立ちます
  2. :タイムスタンプ(4バイト)

    • 1970年1月1日からの秒数を格納
    • Updated_at、created_atなどの列に役立ちます。
  3. :日付(3バイト)
    • 店舗日付
  4. :時間(3バイト)
    • 時間を保存
11
mingca