Подтвердить что ты не робот

Mysql datatype хранить только месяц и год

Я пишу php-приложение, которое будет хранить данные STUDENT в реляционной базе данных MySQL. Я пытаюсь найти лучший способ/тип данных для хранения месяца и года вместе без дня. Я не знаю, должен ли я просто хранить его как DATE и использовать php, чтобы просто сохранить день в качестве первого или использовать другой тип данных, с которым я в настоящее время не знаком. В идеале я не хочу хранить день, потому что день не всегда будет таким же и потребует изменения исходного кода php, если день изменится в будущем.

Просто для получения дополнительной информации, я храню STUDENT INTENT_TO_GRAD. Клиент, похоже, хочет, чтобы эта информация была ссылкой или визуальна для отчета, а не для его использования для обработки данных. Другими словами, единственное функциональное требование для этих данных должно отображаться в отчете.

4b9b3361

Ответ 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>