Разница между разными форматами даты / времени в 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 вам нужно только решить, нужно ли вам хранить дату, время или и то и другое.
TIME
Столбец MySQL не является строго «временем суток», поскольку он принимает часы> 24; это также можно использовать как «прошедшее время».: datetime (8 байт)
: метка времени (4 байта)
источник
Вот удивительное и точное объяснение, которое я нашел.
источник: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .
Также...
таблица с разными типами столбцов date и соответствующими типами миграции рельсов в зависимости от базы данных
источник