Вопрос 1
Я работаю с системой, где дата хранится как целое число (фактическое число (8,0)), и я заметил, что другие системы также хранят дату как int, например, cisco в этой теме . пример
20120101 -- 01 Jan 2012
Есть ли какое-то преимущество в том, чтобы хранить систему числовых дат и не использовать SQL Datetime?
вопрос 2
Сейчас я пытаюсь перебрать числовую дату, чтобы найти клиентов между двумя датами. Если start
и enddate
охватывает два месяца, я получаю тысячи записей вместо 60. Пример:
create table #temp1(day int,capacity int) /* just a temp table */
declare @start int
declare @end int
set @start=20111201
set @end = 20120131
while (@start <= @end)
Begin
insert into #temp1 /* I am storing things in #temp table so data looks pretty */
exec usp_GetDailyCap @date1= @start
set @start = @start + 1;
end
select * from #temp1
Это тянет 8931 записей вместо 60. Есть ли лучший способ улучшить логику выше, чтобы я выбирал только действительные даты? Я пробовал IsDate и подзапросы, но это не совсем эффективно.
sql-server
sql-server-2008
date-format
Jackofall
источник
источник
Ответы:
Чтобы ответить на ваш первый вопрос, я бы рекомендовал использовать
DATETIME
тип данных в SQL Server. Не обязательно по соображениям производительности, но для использования функциональности, специфичной для СУБД. Например, вам придется заново изобретать много логики просто сделать базовую дату математики (думаетеDATEDIFF()
,DATEADD()
,DATEPART()
и многие другие функции. Они явно приспособлены кDATETIME
типу данных и легко работать с).Что касается вашего второго вопроса, вы сталкиваетесь с точной проблемой, на которую направлен первый вопрос (и мой ответ) . Вы рассматриваете даты 20111201 и 20120131 как даты, и ваш мозг говорит вам, что разница должна составлять 60 дней. Ну, вы перебираете, основываясь на дельте ... которая:
20120131 - 20111201 = 8930
(с включенным циклом это будет 8931)Другими словами, ваш
WHILE
цикл выполняется 8931 раз. Это происходит потому, что это целочисленные значения, и ваш цикл не будет переходить с 20111231 на 20120101.Вы, целые числа, не собираетесь принимать во внимание ограничение по годам и месяцам (т.е. ваша проблема по Вопросу 2 ).
источник
20121301
и20120230
даже в20129999
качестве даты.Вы можете использовать таблицу календаря и выдавать последовательные номера для ваших дат, как показано ниже:
Номер даты
20120229 1234
20120301 1235
Необходимо создать таблицу календаря, но это очень простая задача.
источник
Потенциальные типы данных и их размеры / ограничения:
Плюсы для числового типа данных:
Минусы для числового типа данных:
Честно говоря, вам лучше использовать тип данных даты ИМХО.
источник