Filtrar dados a partir de campos DateTime

26/03/2015

Olá pessoal,

Eu tenho a seguinte instrução sql (group by) para filtrar dados do banco de dados:

SELECT P.Descricao, COUNT (C.Id) as Quantidade,
       SUM (C.ValorTotalServico) AS Valor FROM Protocolo C INNER JOIN TipoServico
       as T ON T.Id = C.ServicoId INNER JOIN PlanoContasFinanceiro AS P ON P.Id = T.PlanoContasFinanceiroId WHERE ((C.Cadastro > = @dtInicial)
       and (C.Cadastro < = @dtFinal))
       and (C.ExclusaoEm IS NULL AND C.Inativo = 0) GROUP BY P.Descricao


As variáveis @dtInicial e @dtFinal, contém as datas no formato brasileiro "dd/mm/yyyy".



O campo "Cadastro" da minha tabela que utilizo na clausula "Where", contém as datas (datetime) armazenadas no formato americano "mm/dd/yyyy hh:mm:ss", ou seja, o campo "Cadastro" contem também a hora, minuto e segundo que eu preciso desprezar na minha consulta.



Gostaria de saber dos colegas, como faço para filtrar e formatar na minha instrução SQL acima (tanto nas variáveis como no campo Cadastro), as datas no formato "yyyy/mm-dd" ???



Abraços

Melhor resposta

26/03/2015

Para formatar a data no formato que você precisa, embora a conversão implícita do Sql Server deve resolver o problema, siga a dica do Thiago... use convert !

Tenta assim :

SELECT P.Descricao, COUNT (C.Id) as Quantidade,
       SUM (C.ValorTotalServico) AS Valor 
FROM Protocolo C INNER JOIN TipoServico as T ON T.Id = C.ServicoId 
                 INNER JOIN PlanoContasFinanceiro AS P ON P.Id = T.PlanoContasFinanceiroId 
WHERE ((C.Cadastro >= convert(datetime,@dtInicial,101))
       and (C.Cadastro <= convert(datetime,@dtFinal,101)))
       and (C.ExclusaoEm IS NULL AND C.Inativo = 0) 
GROUP BY P.Descricao

As diversas possibilidade de formato, você acha em : https://msdn.microsoft.com/pt-br/library/ms187928.aspx

Boa sorte !

Marcos P

Responder Citar

Outras Respostas

26/03/2015

Thiago Santana

Hugo, tenta usar o CONVERT(VARCHAR,SEUCAMPO,103)
Responder Citar

26/03/2015

Marcos P

Qual o tipo de @dtInicial e @dtFinal ?

São variáveis char ?
Responder Citar

26/03/2015

Hugo Currículo

Hugo, tenta usar o CONVERT(VARCHAR,SEUCAMPO,103)


Bom dia Thiago, muito obrigado pelo feedback.

Eu sou muito "fraco" em SQL server, mas como seria isso na minha instrução ?
Responder Citar

26/03/2015

Hugo Currículo

Qual o tipo de @dtInicial e @dtFinal ? São variáveis char ?


Olá Marcos como vai tudo bem?! tudo na paz?!

As minhas variáveis @dtInicial e @dtFinal são do tipo Date
Responder Citar

26/03/2015

Hugo Currículo

Antes de mais nada, gostaria de agradecer a você Marcos e ao Thiago Santana pela boa vontade em me responder prontamente.

Marcos, ainda me resta uma dúvida, baseado na sugestão do Thiago, seria prudente também converter o "C.Cadastro" também ?, ou seja, tipo assim :

WHERE ((convert(date,C.Cadastro,103) >= convert(date,@dtInicial,103))
       and (convert(date, C.Cadastro,103) <= convert(date,@dtFinal,103)))
       and (C.ExclusaoEm IS NULL AND C.Inativo = 0) 
Responder Citar

26/03/2015

Marcos P

No modo nativo, todos os campo datetime no Sql Server são armazenados como : mês dd aaaa hh:miAM ( 100 ).

A conversão pode ser feita para qualquer formato, em qualquer variável e em qualquer ponto da query.

Por ser uma questão implícita ao processador do Sql Server, não existe perda de performance nessas conversões.

Resumindo... use como lhe for mais conveniente !
Responder Citar

26/03/2015

Thiago Santana

Isso mesmo Hugo!
Como você está fazendo uma comparação de dados no Where é necessário trabalhar com os mesmos campos no mesmo formato!
E aí conseguiu resolver o problema?
Responder Citar

26/03/2015

Hugo Currículo

Isso mesmo Hugo! Como você está fazendo uma comparação de dados no Where é necessário trabalhar com os mesmos campos no mesmo formato! E aí conseguiu resolver o problema?


Funcionou beleza Thiago, graças a vocês.

Convertendo os dois lados (campo tabela e a variável) consegui obter êxito na minha consulta.

Valeu demais e mais uma vez muito obrigado pela paciência e boa vontade.

Fiquem na paz!

Abraços
Responder Citar

26/03/2015

Thiago Santana

Que bom Hugo!
Conhecimento é pra ser compartilhado!
Abraço
Responder Citar