У Ruby on Rails, яка різниця між DateTime, Timetamp, Time and Date?


414

На мій досвід, правильні дати / часи, коли програмування завжди загрожує небезпекою та складністю.

Ruby and Rails завжди уникали мене на цьому, хоча б через переважну кількість варіантів; Я ніколи не маю ідеї, яку мені вибрати.

Коли я використовую Rails і переглядаю типи даних ActiveRecord, я можу знайти таке

: datetime,: timetamp,: time, and: date

і поняття не маю, в чому полягають відмінності або де ховаються ґетчі.

Яка різниця? Для чого ви їх використовуєте?

(PS Я використовую Rails3)

Відповіді:


572

Різниця між різними форматами дати / часу в 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 вам потрібно лише вирішити, чи потрібно зберігати дату, час або те і інше.


7
Для запису я віддаю перевагу абсолютним часовим позначкам (unix), оскільки формат YYYY-MM-DD залежить від використовуваного часового поясу. Таким чином, клієнт повинен знати часовий пояс сервера і повинен робити перетворення. Секунди з 1970 року абсолютних часових позначок цього питання не мають.
n13

32
@ n13 Хороший момент, але насправді це не проблема в Rails, оскільки він перетворюється на UTC, перш ніж вставляти дати в базу даних.
фон Конрад

13
Це одна з найкорисніших публікацій у Всесвіті Рейлів. Це слід додати до путівника по рейках ...
Андрій

4
TIMEСтовпець MySQL не є строго "порою дня", оскільки він приймає години> 24; він також може бути використаний як "минулий час".
nickgrim

6
Це те саме в інших dbs? наприклад, постгреси?
Енді Хайден

24
  1. : дата (8 байт)

    • Відформатовані дата та час магазинів РРРР-MM-DD HH: MM: SS
    • Корисно для стовпців, таких як Birth_date
  2. : часова марка (4 байти)

    • Зберігає кількість секунд з 1970-01-01
    • Корисно для стовпців, як оновлений_at, created_at
  3. : дата (3 байти)
    • Дата зберігання
  4. : час (3 байти)
    • Магазин час

3
Це більше схоже на версію TL: DR, прийняту відповідь вище
Chidozie Nnachor,

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' Діапазон підтримуваних DATETIME: '1000-01-01 00:00:00' до '9999 -12-31 23:59:59 ′

джерело: https://www.dbrnd.com/2015/09/difference-bet between-datetime-and-timestamp-in- mysql/#: ~ : text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .

Також ...

таблиця з різними типами "дати" стовпців та відповідними типами міграції рейок залежно від бази даних

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.