Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 514825
            [titulo] => Filtrar dados a partir de campos DateTime
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-03-26 10:03:53
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 378439
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marcos P
            [Apelido] => 
            [Foto] => 378439_20140801115452.png
            [Conteudo] => 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 :

[code]
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
[/code]
As diversas possibilidade de formato, você acha em : [url:descricao=https://msdn.microsoft.com/pt-br/library/ms187928.aspx]https://msdn.microsoft.com/pt-br/library/ms187928.aspx[/url]

Boa sorte ! ) )

Filtrar dados a partir de campos DateTime

Hugo
|
MVP
    26 mar 2015

Olá pessoal,
Eu tenho a seguinte instrução sql (group by) para filtrar dados do banco de dados:
#Código

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

Post mais votado

Marcos P
   - 26 mar 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 :

#Código

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 !

Thiago Santana
   - 26 mar 2015

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

Marcos P
   - 26 mar 2015

Qual o tipo de @dtInicial e @dtFinal ?

São variáveis char ?

Hugo
|
MVP
    26 mar 2015


Citação:
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 ?

Hugo
|
MVP
    26 mar 2015


Citação:
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

Thiago Santana
   - 26 mar 2015

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

Citação:
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 :

#Código

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!

Hugo
|
MVP
    26 mar 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 :

#Código

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) 

Marcos P
   - 26 mar 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 !

Thiago Santana
   - 26 mar 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?

Hugo
|
MVP
    26 mar 2015


Citação:
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

Thiago Santana
   - 26 mar 2015

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