Questão 1
Estou trabalhando com um sistema em que a data é armazenada como inteiro (número numérico real (8,0)) e notei que outros sistemas também armazenam a data como int, como cisco, neste segmento . Exemplo
20120101 -- 01 Jan 2012
Existe alguma vantagem em manter o sistema de datas numéricas e não usar o SQL Datetime?
Questão 2
Agora, estou tentando percorrer a data numérica para encontrar clientes entre duas datas. Se start
e enddate
abranger dois meses, recebo milhares de registros em vez de apenas 60. Exemplo:
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
Isso puxa 8931 registros em vez de 60. Existe uma maneira melhor de melhorar a lógica acima, para que eu puxe apenas datas válidas? Tentei IsDate e subconsultas, mas isso não funcionou de maneira eficiente.
sql-server
sql-server-2008
date-format
Jackofall
fonte
fonte
Respostas:
Para responder sua primeira pergunta, eu recomendaria o uso do
DATETIME
tipo de dados no SQL Server. Não necessariamente por razões de desempenho, mas para aproveitar a funcionalidade específica do RDBMS. Por exemplo, você teria que re-inventar um monte de lógica só para fazer matemática básica data (penseDATEDIFF()
,DATEADD()
,DATEPART()
e muitas outras funções. Eles são, obviamente, adaptado para oDATETIME
tipo de dados e são fáceis de trabalhar com).Quanto à sua segunda pergunta, você está enfrentando o problema exato ao qual a primeira pergunta (e a minha resposta) está direcionada . Você está visualizando 20111201 e 20120131 como datas, e seu cérebro está lhe dizendo que deve haver uma diferença de 60 dias. Bem, você está fazendo um loop com base no delta ... que é:
20120131 - 20111201 = 8930
(com o loop inclusivo será 8931)Em outras palavras, seu
WHILE
loop está executando 8931 vezes. Isso está acontecendo porque esses são valores inteiros e seu loop não vai pular de 20111231 direto para 20120101.Seus números inteiros não levarão em consideração o limite de anos e meses (ou seja, seu problema da Questão 2 ).
fonte
20121301
e20120230
e até mesmo20129999
como uma data.Você pode usar uma tabela de calendário e emitir números consecutivos para suas datas, da seguinte maneira:
Número da data
20120229 1234
20120301 1235
A tabela do calendário deve ser gerada, mas é uma tarefa muito fácil.
fonte
Tipos de dados potenciais e seus tamanhos / limitações:
Prós para o tipo de dados numéricos:
Contras para o tipo de dados numéricos:
Honestamente, é melhor usar o tipo de dados de data IMHO.
fonte