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


414

私の経験では、プログラミングが正しい日付と時間を取得することは常に危険と困難に満ちています。

オプションの数が圧倒的に多いためかどうかにかかわらず、RubyとRailsは常にこの問題を回避していました。どれを選べばいいかわからない。

Railsを使用していて、ActiveRecordデータ型を見ると、次のことがわかります

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

そして、違いが何であるか、またはどこがおかしいのかわからない。

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

(PS私はRails3を使用しています)

回答:


572

ActiveRecordの異なる日付/時刻形式の違いは、Railsとはほとんど関係がなく、使用しているデータベースに関係します。

(もしそれが最も人気がありますので、他に理由がない)の例としてMySQLを使用して、あなたが持っているDATEDATETIMETIMEおよびTIMESTAMP列のデータ型。あなたが持っているようCHARVARCHAR、、、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対応するDATETIME、それぞれ。

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


7
レコードの場合、YYYY-MM-DD形式は使用するタイムゾーンに依存するため、絶対タイムスタンプ(UNIX)を使用します。したがって、クライアントはサーバーのタイムゾーンを知っている必要があり、変換を行う必要があります。秒から1970年以降の絶対タイムスタンプにはその問題はありません。
n13

32
@ n13良い点ですが、データベースに日時を挿入する前にUTCに変換されるため、Railsの問題ではありません。
フォンコンラッド2012

13
これはRailsの世界で最も役立つ投稿の1つです。これはRailsガイドに追加する必要があります...
Andrew

4
MySQLのTIMEカラムは24時間を超えることができるため、厳密には「時刻」ではありません。「経過時間」としても使えます。
ニックグリム2013年

6
これは他のデータベースでも同じですか?例:postgres?
アンディヘイデン

24
  1. :datetime(8バイト)

    • 日付と時刻がYYYY-MM-DD HH:MM:SS形式で格納されます
    • birth_dateなどの列に役立ちます
  2. :timestamp(4バイト)

    • 1970-01-01以降の秒数を格納します
    • updated_at、created_atなどの列に役立ちます
  3. :日付(3バイト)
    • 店舗の日付
  4. :time(3バイト)
    • 店舗時間

3
これは、上記の受け入れられた回答のTL:DRバージョンに似ています
Chidozie Nnachor 2018

0

これが私が見つけた素晴らしく正確な説明です。

TIMESTAMPは、レコードの変更を追跡し、レコードが変更されるたびに更新するために使用されます。DATETIMEは、レコードの変更の影響を受けない特定の静的な値を格納するために使用されます。

TIMESTAMPは、異なるTIME ZONE関連の設定の影響も受けます。DATETIMEは定数です。

TIMESTAMPは内部で現在のタイムゾーンをUTCに変換して格納し、取得中に現在のタイムゾーンに変換して戻します。DATETIMEはこれを行うことができません。

TIMESTAMPは4バイトで、DATETIMEは8バイトです。

TIMESTAMPでサポートされている範囲: '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTC DATETIMEでサポートされている範囲: '1000-01-01 00:00:00'から '9999 -12-31 23:59:59 ′

ソース:https : //www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/# :~: text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant

また...

さまざまな列の「日付」タイプと、データベースに応じて対応するレール移行タイプの表

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.