Хранить только месяц и год в SQL Server 2008?

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Можно ли сохранить месяц / год в SQL Server 2008 с обычным datetime? Мне не нужна временная метка, и в столбце будут храниться уникальные комбинации месяцев и лет (т.Е. 10-11, 11-11, 12-11 и т. Д.).

Какие-либо рекомендации?

Ответ №1:

Не зная предполагаемого использования, невозможно дать правильный совет. Однако сохранение месяца и года легко выполнить по крайней мере тремя способами:

  • используйте поле даты, но всегда сохраняйте в нем первый день месяца в полночь; затем всегда настраиваемый формат поля даты для отображения
  • добавьте целочисленные поля года и месяца и заполните их, разделив дату
  • добавьте целочисленное поле, в котором вы кодируете его как год * 100 месяц или какую-либо другую полезную схему

Комментарии:

1. Обратите внимание, что уоллик упоминает тип данных даты в своем первом варианте. Это отличается от поля даты и времени. Все три этих варианта имеют большой смысл.

2. На случай, если вам интересно, как разложить целое число обратно на год / месяц, вот как я это сделал, используя csharp: год = день рождения / 100; день = день рождения % 100;

Ответ №2:

Sql Server сохранит данные даты и времени полностью (год-месяц-день час: мин: сек.миллисекунд), несмотря ни на что.

Когда вы сохраняете свои даты, вы можете сделать день 1-м числом месяца. Просто форматируйте даты так, как вы хотите, когда выполняете свои запросы.

http://www.sql-server-helper.com/tips/date-formats.aspx

Ответ №3:

Начиная с SQLServer 2008 и далее:

Сохраните как Date столбец и добавьте следующее ограничение проверки, чтобы убедиться, что значение всегда является первым за месяц:

 datepart(month, MyDate)<>datepart(month,dateadd(day, -1, MyDate))
 

Комментарии:

1. Мне нравится этот подход, но я думаю, что более простое ограничение проверки DAY(MyDate) = 1 .

Ответ №4:

Вы не можете хранить только год и месяц в столбце DateTime. Ну, что вы можете сделать, так это установить остальные значения по умолчанию. ie: 2011.10.1.1, 2011.11.1.1 вот так.

Или вы можете сохранить его как строку.

Ответ №5:

 SELECT RIGHT(CONVERT(VARCHAR(10), GETDATE(), 105), 7) AS [MM-YYYY]
 

Вы должны попробовать это