Armazenando a data como inteiro (numérico), quais são as vantagens

11

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 starte enddateabranger 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.

Jackofall
fonte
Se você estiver executando o SQL Server 2008 ou superior, poderá usar apenas o tipo de dados Data. É um pouco menor e não força você a incluir tempo, mas quase todas as funções de data e hora do SQL ainda funcionam para isso.
DForck42
2
Eu só vejo desvantagens nessa abordagem, nenhuma vantagem alguma
a_horse_with_no_name 27/03

Respostas:

11

Para responder sua primeira pergunta, eu recomendaria o uso do DATETIMEtipo 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 (pense DATEDIFF(), DATEADD(), DATEPART()e muitas outras funções. Eles são, obviamente, adaptado para o DATETIMEtipo 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 WHILEloop 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 ).

Thomas Stringer
fonte
Bem, essa é exatamente a minha pergunta. Para datas numéricas, os loops podem chegar a milhares, não apenas 30 ou 29 dias. Mas lembre-se de que estou trabalhando com um sistema profissional . E até a Cisco usa o que parece.
Jackofall
4
Além de desempenho e funcionalidade, também há integridade. Com inteiros como datas, o db permitiria 20121301e 20120230e até mesmo 20129999como uma data.
ypercubeᵀᴹ
@ Jackofall A Cisco não tem a plataforma de um RDBMS por trás dele. Eles escreveram sua própria lógica. Por que eles não usam apenas números inteiros? Desde o início, essa é provavelmente a maneira mais fácil para softwares de baixo nível. Mas estamos falando de maçãs e laranjas aqui.
Thomas Stringer
3
@ Jackofall: Há uma grande diferença entre armazenar datas como números inteiros (e ter lacunas) e armazenar datas / horários como números inteiros - ou mesmo datas como números inteiros, como o VB / Excel.
ypercubeᵀᴹ
4
Existem muitos (se não a maioria) bancos de dados projetados profissionalmente que usam más técnicas. Eu trabalhei com muitos produtos COTS e não vi nenhum que fosse bem descrito da perspectiva do banco de dados.
HLGEM 27/03
6
  1. Ralph Kimball recomenda armazenar datas como números inteiros. Ele escreveu muito, artigos e livros on-line.
  2. 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.

AK
fonte
11
Eu gostaria de ver o caso em que você filtrar uma consulta juntando-se a uma tabela de data com as datas armazenadas como numérico e filtrar essas datas numéricos iria bater usando "onde [data] entre @startdate e @EndDate"
DForck42
11
@ DForck42, não há necessidade do caso que você está sugerindo: "where [dateAsInt] entre 20120229 e 20120329" retornaria exatamente as mesmas linhas que "where [date] entre '20120229' e '20120329'"
AK
3
E qual foi o seu raciocínio?
HLGEM 27/03
5

Tipos de dados potenciais e seus tamanhos / limitações:

  • Decimal (8,0): 5 bytes
  • Data: 3 bytes, 0001-01-01 a 9999-12-31
  • Int: 4 bytes

Prós para o tipo de dados numéricos:

  • Eles estão bonitos?

Contras para o tipo de dados numéricos:

  • Requer código personalizado para lidar com operações de data
  • Requer código personalizado para gerenciar datas corretas (por exemplo, não permitindo 20120230 [30 de fevereiro de 2012])
  • Pegada de dados maior quando comparada ao tipo de dados Data.

Honestamente, é melhor usar o tipo de dados de data IMHO.

DForck42
fonte