none
Calcular Diferenças entre Datas RRS feed

  • Pergunta

  • Prezados, Bom Dia

    Preciso de ajuda de vocês, e desde já agradeço as colaborações.

    Estou criando um relatório e tenho 02 colunas de data, uma é DATA_VALIDADE e outra é DATA_PRODUCAO e preciso agora criar uma outra coluna chamada DIAS_PARA_VENCER.

    Ai o resultado dessa coluna precisa ser a diferença entre as data, ou seja, data_validade - a data_producao, significa que terei tantos dias de produtos sem vencer.

    No sqlserver quando eu executo meu relatório, ele me traz a informação correta, -60 por exemplo, porém, quando utilizo pelo meu sistema, ele me traz o resultado dessa forma -dd/mm/yy

    Preciso de ajuda para que consiga trazer a informação correta, vou enviar 02 prints, um executando o relatório pelo sqlserver e outro pelo meu sistema.

    o código sql que uso vai abaixo.

    SELECT SVOL.*,
    RTRIM(D1.COD_DIVISAO1) +'.'+ RTRIM(D2.COD_DIVISAO2) +'.'+ D3.COD_DIVISAO3 AS COD_DIVISAO,
    RTRIM(D1.DESC_DIVISAO1) +' - '+ RTRIM(D2.DESC_DIVISAO2) +' - '+ D3.DESC_DIVISAO3 AS DESC_DIVISAO,
    RTRIM(P.COD_PRODUTO) +'-'+ PR.COD_REF AS PRODUTO,
    CASE
      WHEN PR.DESC_GRADE <> '' THEN RTRIM(P.DESC_PRODUTO_EST)  +' - '+ PR.DESC_GRADE
      ELSE P.DESC_PRODUTO_EST
      END AS DESC_PRODUTO
     FROM 

    (SELECT 
     COD_PRODUTO, COD_REF, DATA_VALIDADE, DATA_PRODUCAO, DATEDIFF(DAY, DATA_VALIDADE, DATA_PRODUCAO) AS DIAS_PARA_VENCER,SUM(PESO_LIQUIDO) AS PESO,
    COUNT(*) AS CAIXAS
     FROM TBVOLUME V
     WHERE V.Cod_filial LIKE '141'
           AND V.Cod_produto BETWEEN '0' AND '999999'
           AND V.Cod_ref BETWEEN '0' AND '0'
           AND V.Data_validade BETWEEN '01/01/2019' AND '12/31/2019'
           AND V.Data_producao BETWEEN '01/01/2019' AND '12/31/2019'  
           AND V.Status = 'E' 

     GROUP BY COD_PRODUTO, COD_REF, DATA_VALIDADE, DATA_PRODUCAO) SVOL 
    INNER JOIN TBPRODUTOREF PR ON SVOL.COD_PRODUTO = PR.COD_PRODUTO AND SVOL.COD_REF = PR.COD_REF 
    INNER JOIN TBPRODUTO P ON SVOL.COD_PRODUTO = P.COD_PRODUTO 
    INNER JOIN TBDIVISAO1PROD D1 ON D1.COD_DIVISAO1 = P.COD_DIVISAO1
    INNER JOIN TBDIVISAO2PROD D2 ON D2.COD_DIVISAO2 = P.COD_DIVISAO2
    INNER JOIN TBDIVISAO3PROD D3 ON D3.COD_DIVISAO3 = P.COD_DIVISAO3

    ORDER BY 
    COD_DIVISAO,
    DESC_PRODUTO,
    DATA_VALIDADE,
    DATA_PRODUCAO 

    Relatório SQLServer

    Relatório Sistema

    terça-feira, 18 de junho de 2019 12:52

Respostas

  • Exato.

    Não vejo problema no sql. Por isso digo que está estranho.

    Acredito que o problema seja em como o sistema está tratando esse dado.

    Percebi que na consulta ele te retornou: -60. Já tentou deixar esse valor positivo para ver como o sistema trata?

    • Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 19 de junho de 2019 10:43
    • Não Sugerido como Resposta José Diz domingo, 21 de julho de 2019 12:15
    • Marcado como Resposta José Diz domingo, 21 de julho de 2019 12:15
    terça-feira, 18 de junho de 2019 17:40

Todas as Respostas

  • Jessé, bom dia.

    Qual o tipo de dado seu sistema está recebendo no "Dias Para Vencer"? Se entendi bem, o SQL está retornando um número inteiro para um campo de data no sistema?

    terça-feira, 18 de junho de 2019 13:32
  • Mateus, "Dias Para Vencer" seria a diferença entre as datas, e o SQL está trazendo inteiro, porém, no meu relatório no sistema eu não uso "Dias Para Vencer" como filtro, por isso, não defini um tipo de dado...

    Veja, na imagem, não coloquei "Dias Para Vencer" em filtro então, se eu tiver que tratar essa coluna, teria que ser no próprio código SQL, certo? Sabe me informar como posso fazer isso?


    Veja se o Print Abaixo ajuda em alguma coisa, por favor.


    • Editado Jessé Angelo Chagas terça-feira, 18 de junho de 2019 14:38 Acrescentei Mais Informações
    terça-feira, 18 de junho de 2019 14:32
  • Abaixo do "Dias Para Vencer" ele preenche com: -dd/mm/yy.

    Geralmente é usado para converter uma data para string com o modelo passado por parâmetro.

    Ou seja, uma data qualquer é transformada em string pelo parâmetro: dd/mm/yy ficando 01/01/01.

    Como você enviou um inteiro referente aos dias, ele não consegue converter para uma data.

    terça-feira, 18 de junho de 2019 15:36
  • Mais nesse caso, a Coluna "Dias Para Vencer" não é pra retornar um data, e sim quantidade de dias de diferença, exemplo.

    DATA_PRODUCAO = 18/06/2019

    DATA_VALIDADE = 18/08/2019

    DIAS_PARA_VENCER = 60

    Meu SQLServer já traz assim, mais o relatório no Sistema tenta trazer uma data ao invés do 60

    terça-feira, 18 de junho de 2019 15:54
  • Jessé boa tarde!

    Estranho por que o DATEDIFF já retorna um inteiro.

    Já tentou colocar um CAST antes do DATEDIFF ? Exemplo: CAST(DATEDIFF(DAY, data1, data2) as int)

    Veja se tem em algum lugar na ferramenta de relatório, se ele ta tentando fazer uma mascara no campo. Ou mude para outro tipo de dados o campo no relatório, no caso está como Integer, muda pra string e faz o cast para varchar na consulta.

    terça-feira, 18 de junho de 2019 17:13
  • Exato.

    Não vejo problema no sql. Por isso digo que está estranho.

    Acredito que o problema seja em como o sistema está tratando esse dado.

    Percebi que na consulta ele te retornou: -60. Já tentou deixar esse valor positivo para ver como o sistema trata?

    • Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 19 de junho de 2019 10:43
    • Não Sugerido como Resposta José Diz domingo, 21 de julho de 2019 12:15
    • Marcado como Resposta José Diz domingo, 21 de julho de 2019 12:15
    terça-feira, 18 de junho de 2019 17:40
  • Jessé, o assunto já foi resolvido?

    Se alguma resposta deste tópico foi de auxílio na solução do problema, poderia marcá-la?

    • Editado José Diz quarta-feira, 3 de julho de 2019 12:36
    quarta-feira, 3 de julho de 2019 12:36