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

340

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

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

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

: datetime,: timestamp,: time и: date

и не имеют представления о том, что такое различия или где скрываются пропасть.

Какая разница? Для чего вы их используете?

(P.S. Я использую Rails3)

Теги:
datetime
timestamp
date
time

2 ответа

523
Лучший ответ

Разница между разными форматами даты и времени в 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 timestamp. Его действительный диапазон варьируется от 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 вам нужно только решить, нужно ли вам хранить дату, время или и то, и другое.

  • 6
    Для записи я предпочитаю абсолютные метки времени (Unix), потому что формат YYYY-MM-DD зависит от используемого часового пояса. Таким образом, клиент должен знать часовой пояс сервера и должен выполнять преобразования. Абсолютные временные метки с 1970 года не имеют этой проблемы.
  • 28
    @ n13 Хороший вопрос, но на самом деле проблема не в Rails, поскольку он конвертируется в UTC перед вставкой datetime в базу данных.
Показать ещё 7 комментариев
1
  • : datetime (8 bytes)

    • Сохранение даты и времени в формате YYYY-MM-DD HH: MM: SS
    • Полезно для столбцов типа birth_date
  • : timestamp (4 байта)

    • Сохраняет количество секунд с 1970-01-01
    • Полезно для таких столбцов, как updated_at, created_at
  • : дата (3 байта)
    • Дата публикации
  • : время (3 байта)
    • Время хранения
  • 0
    Это больше похоже на версию TL: DR принятого ответа выше

Ещё вопросы

Сообщество Overcoder
Наверх
Меню