none
Data no SQL Server 2005 SEM TEMPO! RRS feed

  • Pergunta

  • Boa Tarde,

     

              Creio que minha pergunta seja muito simples, mas não encontro de jeito nenhum uma resposta para isso.

              Estou colocando uma data na minha tabela, mas não há a opção  "date" no SQL Server 2005 que existia no MySql (Que eu mexia antes). Tem um tal de Datetime e SmallDatetime (que por acaso não vi diferença alguma) que salvam as horas. Se envio um valor dd/mm/aaaa para o banco de dados ele salva como dd/mm/aaaa 12:00 AM.

              Teria algum tipo no SQL Server 2005 que salvasse apenas a data?

              Usaria varchar (ou algo do gênero) se não fizesse conta entre datas e comparações com a data atual.

     

    Agradeço desde já! 

    quarta-feira, 21 de janeiro de 2009 10:57

Respostas

  • Bom Dia AlexandreM,

     

    O SQL Server durante muito tempo não suportava os tipos DATE e TIME. Esses tipos são definidos pelo ANSI e o MySQL assim como muitos outros tem o devido suporte. Apenas no SQL Server 2008 fomos contemplados com esses tipos de dados.

     

    No SQL Server 2005 temos o tipo de dados SMALLDATETIME e o DATETIME. O SMALLDATETIME ocupa 4 bytes e possui um range de datas de 01/01/1900 até próximo de 2079 enquanto o DATETIME vai desde 1753 até 9999 e ocupa 8 bytes. Ambos gravam a hora e não há como omitir isso. No caso do SMALLDATETIME a precisão é de minutos enquanto no DATETIME a precisão é de 1/300 de segundo.

     

    O melhor no SQL Server 2005 é que você utilize os tipos SMALLDATETIME ou DATETIME (se for o caso) e grave a hora como meia-noite sempre no formato YYYYMMDD. Ex: INSERT INTO tbl ('20090121 00:00').

     

    Você não deve utilizar tipos como VARCHAR ou CHAR para armazenar datas. Além de ocupar mais espaço, você terá que fazer diversas validações e comparações que normalmente pioram o desempenho. Para não ter problemas em relação a horas, sugiro que você utilize o exemplo abaixo:

     

    Code Snippet

    declare @t table (data smalldatetime)

    insert into @t values ('20090119 00:05')

    insert into @t values ('20090120 00:05')

    insert into @t values ('20090121 08:15')

    insert into @t values ('20090121 10:00')

    insert into @t values ('20090121 13:00')

    insert into @t values ('20090122 12:00')

     

    -- Selecionar todos os registros de hoje

    SELECT Data FROM @T

    WHERE Data >= CONVERT(CHAR(10),GETDATE(),112)

    And Data < DATEADD(d,1,CAST(CONVERT(CHAR(10),GETDATE(),112) AS SMALLDATETIME))

     

    Admito que não é uma situação muito prática (você pode diminuir a complexidade utilizando variáveis ou tipando os parâmetros com SPs). O SQL Server 2008 isso é bem mais simples visto que há tipos próprios para datas e horas.

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    quarta-feira, 21 de janeiro de 2009 11:27