Mysql datatype хранить только месяц и год
Я пишу php-приложение, которое будет хранить данные STUDENT в реляционной базе данных MySQL. Я пытаюсь найти лучший способ/тип данных для хранения месяца и года вместе без дня. Я не знаю, должен ли я просто хранить его как DATE и использовать php, чтобы просто сохранить день в качестве первого или использовать другой тип данных, с которым я в настоящее время не знаком. В идеале я не хочу хранить день, потому что день не всегда будет таким же и потребует изменения исходного кода php, если день изменится в будущем.
Просто для получения дополнительной информации, я храню STUDENT INTENT_TO_GRAD. Клиент, похоже, хочет, чтобы эта информация была ссылкой или визуальна для отчета, а не для его использования для обработки данных. Другими словами, единственное функциональное требование для этих данных должно отображаться в отчете.
Ответы
Ответ 1
Зачем беспокоиться? Просто сохраните его как полную дату (возможно, всегда используя первый как день) и используйте функции базы данных MONTH()
и YEAR()
, если вам нужна только часть его. Это значительно упрощает использование этого поля, поскольку вы все еще можете выполнять запросы диапазона и т.д.
Ответ 2
В руководстве MySQL говорится, что вы можете хранить частичные даты
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format
Диапазоны для спецификаторов месяца и дня начинаются с нуля из-за факт, что MySQL позволяет хранить неполные даты, такие как '2014-00-00'.
Это означает, что для хранения только года и месяца вы можете использовать столбец DATE
и поместить 00
вместо дня. например 2013-12-00
.
Связано: Хранить неполную дату в поле даты MySQL
Ответ 3
Рассмотрим, как вы собираетесь использовать данные. Если есть какие-либо отчеты, которые вы должны создать, каким образом вы могли бы легче получать и работать с данными?
И вам не нужно использовать поле типа даты. Вы можете просто иметь поле Year и поле Month, которые являются целыми числами. Тогда, когда вам действительно нужно делать какие-либо выражения с ним, требующие даты, достаточно просто собрать их и наложить на дату.
И сохранение в качестве даты с номером дня как 1 и просто игнорирование его вполне нормально и довольно нормально. В конце концов, это не решение, которое будет иметь большое значение (относительно говоря), поэтому я бы выбрал именно тот, который вам больше нравится, и сделайте это.
Ответ 4
Я бы сохранил эти два как два отдельных столбца как целые числа. Это сделает тестовый торт и позволит быстро и легко сортировать и группировать возможности.
Ответ 5
SELECT * FROM Users
WHERE
MONTH(DateTime) = '07'
AND
YEAR(DateTime) = '2015'
AND
DAY(DateTime) = '26'
вы можете фильтровать, как показано выше, но все же, если хотите сохранить год/месяц и день как отдельный, его бесполезно, пока вы не примените индексирование и его очень большие данные.
Ответ 6
Другим решением является создание сгенерированных столбцов из вашего источника DATETIME
/DATE
.
ALTER TABLE stats
ADD COLUMN year SMALLINT GENERATED ALWAYS AS (YEAR(stat_date)) NOT NULL,
ADD COLUMN month smallint GENERATED ALWAYS AS (MONTH(stat_date)) NOT NULL;
Фон
У меня была похожая проблема. Прочитав эту ветку, я решил хранить неполные даты (с нулями). Это работало на более старых версиях MySQL, но более новые версии вызывали ошибку "Неправильная дата". Как упоминалось ранее, вы можете превратить ошибку в предупреждение, используя параметр NO_ZERO_IN_DATE
. Но сама установка устарела. Следовательно, в будущем было бы возможно поддерживать нули в датах только путем отключения строгого режима, таким образом заглушая другие типы ошибок.
Поскольку NO_ZERO_IN_DATE устарела, он будет удален в будущем выпуске MySQL как отдельное имя режима, и его эффект будет включен в эффекты режима строгого SQL.
Моим требованием было построить ежемесячный просмотр таблицы. Мне пришлось добавить индекс по месяцу. Таким образом, вычисление моли на лету с помощью YEAR()
и MONTH()
не было вариантом.
Сгенерированные столбцы служили своей цели. Столбцы year
и month
не были частью первичного индекса, и я мог бы даже сэкономить пространство благодаря сгенерированным VIRTUAL
(не STORED
) столбцам.
связи
Ответ 7
Вы можете использовать тип данных VARCHAR
для хранения только месяца и года.
Для тех, кто использует datepicker
: -
1) Установите тип данных VARCHAR в mysql для хранения месяца и года.
2) Если вы используете проверку jquery и имеете jquery plugin date picker, вам нужно сделать код ниже.
Для ex: -
<script>
$(document).ready(function (){
$('#monthyear').datepicker({
autoclose:true,
format:'mm-yy'
});
//Your form validation code here//
});
</script>