2009-03-30 1 views
31

Мне нужно вставить год (например: 1988, 1990 и т.д.) в базу данных. Когда я использовал Date или Datetime тип данных, он показывает ошибки. Какой тип данных я должен использовать.SQL DataType - как хранить год?

ответ

24

Если вам нужно сохранить год в базе данных, вы должны либо использовать тип данных Integer (если вы только мертвы сохранение года) или тип данных DateTime (который предполагает сохранение даты, которая в основном составляет 1/1/1990 00:00:00 в формате).

+7

** Не ленитесь и «просто используйте int». ** Измените тип данных правильно, два байта int - лучший выбор.Сохраняя 4-значные годы в 4 байтах, вы тратите больше ресурсов, чем просто на дисковое пространство. Ваша система навсегда будет обременена, используя в два раза больше кэш-памяти, нажав вдвое больше данных ввода-вывода и т. Д. Для этого столбца. Это не проблема, см. Http://dba.stackexchange.com/q/4968 –

0

Всего год, ничего больше? Почему бы не использовать простое целое число?

+0

Ohh god ,, По здравому смыслу – peter

+4

Эй! Почему вы пытаетесь сделать так просто? У нас будут проблемы SO! –

1

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

+0

спасибо, thats моя ошибка – peter

25

обычный 4 байта INT - это путь к большому, это пустая трата пространства!

Вы не говорите, какую базу данных вы используете, поэтому я не могу рекомендовать конкретный тип данных. Все говорят «use integer», но большинство баз данных хранят целые числа в 4 байта, что намного больше, чем вам нужно. Вы должны использовать целое число из двух байтов (smallint на SQL Server), которое лучше сохранит пространство.

+1

Чаще всего, тратить пространство, используя int, предпочтительнее использовать меньший тип данных, поскольку большинство современных процессоров являются более эффективной обработкой 4 байтов ints (32 бит), чем меньшие типы данных. – Ender

+0

@ Если вы не используете математику с этими значениями, это скорее процесс хранения и поиска. Вы сможете хранить больше значений в ram, если они меньше, вы сможете читать больше значений с диска, если они меньше, и т. Д. Я не мог найти статей, которые поддерживают вашу идею. http://dba.stackexchange.com/q/4968 –

+1

Все программы компилируются в машинный код в конце, а числа загружаются в регистры. В современных архитектурах процессора все регистры 32-битные или 64-битные. Таким образом, ваша система RDBMS должна будет поместить эти числа в регистры, чтобы провести сравнение, чтобы удовлетворить условия в вашем запросе. А в случае крошечного int и small int, он должен делать конверсию каждый раз, что требует много времени. Вы не можете найти ОФИЦИАЛЬНУЮ статью, поддерживающую мою точку ИЛИ вашу точку, поскольку обычно это компромисс между CPU и IO, поскольку использование int увеличит размер индекса и потребует больше IO – Ender

9

Эй, вы можете использовать год() datatype в MySQL Он доступен в двухзначном или четырехзначном формате.

Примечание: Допустимые значения в формате четырех цифр: 1901 до 2155. Допустимые значения в формате двузначным: 70 до 69, что составляет лет с 1970 по 2069

2

Сохранение «Год» в MSSQL идеале зависеть о том, что вы делаете с ним и каково значение этого «года» для вашего приложения и базы данных. Это, как говорится, есть несколько вещей, чтобы заявить здесь. В 2012 году в MSSQL нет «DataType» для Year of the 2012. Я бы склонялся к использованию SMALLINT, так как он всего 2 байта (сэкономит вам 2 из 4 байтов, которые требует INT). Ваше ограничение состоит в том, что вы не можете иметь год старше 32767 (с SQL Server 2008R2). Я действительно не думаю, что SQL будет базой данных по выбору десять тысяч лет, а тем более 32767. Вы можете рассматривать INT как функцию Year() в MSSQL, которая преобразует тип данных «DATE» в INT. Как я уже сказал, это зависит от того, где вы получаете данные и куда они идут, но SMALLINT должен быть в порядке. INT будет излишним ... если у вас нет других причин, подобных тому, что я упоминал выше, или если потребность в коде требует его в форме INT (например, интеграция с существующим приложением). Скорее всего, SMALLINT должен быть в порядке.

0

Хранение может быть только частью проблемы. Как это значение будет использоваться в запросе?

Будет ли это сопоставлено с другими типами данных даты или времени, или все связанные строки также имеют числовые значения?

Как вы относитесь к изменению требований? Как легко вы могли бы отреагировать на запрос о замене года меньшим временным фрагментом? Теперь они хотят, чтобы он разбился по кварталам?

Цифровой тип может быть легко использован в запросе даты, с помощью таблицы поиска для объединения с такими вещами, как даты начала и окончания (1/1/X-12/31/x) и т. Д. .