Filtrar dados a partir de campos DateTime

SQL Server

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
Hugo

Hugo

Curtidas 0

Melhor post

Marcos P

Marcos P

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 !
GOSTEI 1

Mais Respostas

Thiago Santana

Thiago Santana

26/03/2015

Hugo, tenta usar o CONVERT(VARCHAR,SEUCAMPO,103)
GOSTEI 0
Marcos P

Marcos P

26/03/2015

Qual o tipo de @dtInicial e @dtFinal ?

São variáveis char ?
GOSTEI 0
Hugo

Hugo

26/03/2015

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 ?
GOSTEI 0
Hugo

Hugo

26/03/2015

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
GOSTEI 0
Thiago Santana

Thiago Santana

26/03/2015

Hugo, veja o código que o Marcos te mandou!

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 !


Ai ele utiliza o convert!
GOSTEI 1
Hugo

Hugo

26/03/2015

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) 
GOSTEI 0
Marcos P

Marcos P

26/03/2015

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 !
GOSTEI 0
Thiago Santana

Thiago Santana

26/03/2015

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?
GOSTEI 0
Hugo

Hugo

26/03/2015

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
GOSTEI 0
Thiago Santana

Thiago Santana

26/03/2015

Que bom Hugo!
Conhecimento é pra ser compartilhado!
Abraço
GOSTEI 0
POSTAR