В Ruby on Rails, в чем разница между DateTime, Timestamp, Time и Date?

414

По моему опыту, правильное определение даты / времени, когда программирование всегда чревато опасностями и сложностями.

Ruby и Rails всегда ускользали от меня, хотя бы из-за огромного количества опций; У меня никогда нет идей, которые я должен выбрать.

Когда я использую Rails и смотрю на типы данных ActiveRecord, я могу найти следующее

: datetime,: timestamp,: time, и: 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 вам нужно только решить, нужно ли вам хранить дату, время или и то и другое.

vonconrad
источник
7
Для записи я предпочитаю абсолютные метки времени (unix), потому что формат YYYY-MM-DD зависит от используемого часового пояса. Таким образом, клиент должен знать часовой пояс сервера и делать преобразования. Абсолютные временные метки с 1970 года не имеют этой проблемы.
n13
32
@ n13 Хороший вопрос, но на самом деле проблема не в Rails, поскольку он конвертируется в UTC перед вставкой datetime в базу данных.
vonconrad
13
Это один из самых полезных постов во вселенной Rails. Это должно быть добавлено к направляющей рельсов ...
Эндрю
4
TIMEСтолбец MySQL не является строго «временем суток», поскольку он принимает часы> 24; это также можно использовать как «прошедшее время».
Никгрим
6
Это то же самое в других БД? например, postgres?
Энди Хейден
24
  1. : datetime (8 байт)

    • Сохраняет дату и время в формате ГГГГ-ММ-ДД ЧЧ: ММ: СС
    • Полезно для столбцов, таких как birth_date
  2. : метка времени (4 байта)

    • Количество секунд с 1970-01-01
    • Полезно для столбцов, таких как updated_at, creation_at
  3. : дата (3 байта)
    • Дата магазинов
  4. : время (3 байта)
    • Время магазинов
mingca
источник
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' DTC DETETIME UTC Поддерживаемый диапазон: '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 .

Также...

таблица с разными типами столбцов date и соответствующими типами миграции рельсов в зависимости от базы данных

Станислав Модрак
источник