none
Consulta SQL com DATADIFF com campos concatenados RRS feed

  • Pergunta

  • Boa tarde pessoal!

    Estou fazendo a consulta abaixo. Preciso concatenar no próprio DATATIFF dois campos diferentes da minha tabela. Um da data e outro da hora, e fazer a diferença entre esse dois concatenados e o outro normal. Ocorre que na minha base de testes local esta consulta roda normal, porém na base oficial, apresenta o erro "Mensagem 242, Nível 16, Estado 3, Linha 1 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.". As bases são iguais, somente a minha local está alguns dias desatualizada de registros, mas de resto é igual. Segue a consulta abaixo:

    select C.NUMERO as Fatura,F.NOME as Sit_Fatura, A.NUMERO as Documento,D.NOME as Tipo,E.NOME as Sit_Documento, G.NOME as Tomador,
            C.DATAEMISSAO as Dt_Faturado, H.NUMERO,

    DATEDIFF(MINUTE,(CONVERT(varchar,a.dataemissao,103)+' '+ CONVERT(varchar,a.HORAEMISSAO,114)),convert(varchar,C.DATAEMISSAO,103)) as Tempo_Minutos,

    DATEDIFF(HOUR,(CONVERT(varchar,a.dataemissao,103)+' '+ CONVERT(varchar,a.HORAEMISSAO,114)),convert(varchar,C.DATAEMISSAO,103)) AS Tempo_Horas

    from GLGL_DOCUMENTOS A 
    INNER JOIN GLFT_FATURADOCUMENTOS B ON A.HANDLE=B.DOCUMENTO
    INNER JOIN GLFT_FATURAS C ON B.FATURA=C.HANDLE
    INNER JOIN GLGL_TIPODOCUMENTOS D ON A.TIPODOCUMENTO=D.HANDLE
    INNER JOIN GLGL_ENUMERACAOITEMS E ON A.STATUS=E.HANDLE
    INNER JOIN GLGL_ENUMERACAOITEMS F ON C.STATUS=F.HANDLE
    LEFT JOIN GN_PESSOAS G ON A.TOMADORSERVICOPESSOA=G.HANDLE
    LEFT JOIN FN_DOCUMENTOS H ON A.NOTAFISCALSERVICO=H.NUMERO

    WHERE

    A.TIPODOCUMENTO IN(2,6)
    AND A.TOMADORSERVICOPESSOA NOT IN (116,352)
    AND A.STATUS IN (259,315,225,226,302,890,227,603,420,228,465,313,609,743,314,234,625,219,221,229,439,231,230,235,222)
    AND C.STATUS NOT IN (326,327,335)
    AND A.DATAEMISSAO is not null and A.HORAEMISSAO is not null and C.DATAEMISSAO is not null

    ORDER BY D.HANDLE

    segunda-feira, 29 de abril de 2013 18:18

Respostas

Todas as Respostas

  • Boa tarde,

    Supondo que a coluna a.DataEmissao seja do tipo Date e a coluna a.HoraEmissao do tipo Time, experimente dessa forma:

    DATEDIFF
        (MINUTE,
         DATEADD(second, DATEDIFF(second, 0, a.HORAEMISSAO), CAST(a.dataemissao as datetime)),
         C.DATAEMISSAO) as Tempo_Minutos,
    DATEDIFF
        (HOUR,
         DATEADD(second, DATEDIFF(second, 0, a.HORAEMISSAO), CAST(a.dataemissao as datetime)),
         C.DATAEMISSAO) AS Tempo_Horas

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    segunda-feira, 29 de abril de 2013 18:35
  • Quase meu querido, só que por algum motivo ele está tirando 2 dias na data que estamos concatenando. Fora isso, agora rodou sem erros.

    quinta-feira, 2 de maio de 2013 15:37
  • Boa tarde,

    Você pode postar alguns exemplos de valores das colunas a.dataemissao, a.HORAEMISSAO, C.DATAEMISSAO e o respectivo resultado obtido com o script que sugeri?


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 2 de maio de 2013 18:32
  • Então, vou postar o select na parte de cima alterado para você entender. É que peguei parte da tua solução para colocar no select para me mostrar a data inicial (concatenada) do DATADIFF e percebi que ela diminui 2 dias:

    select C.NUMERO as Fatura,F.NOME as Sit_Fatura, A.NUMERO as Documento,D.NOME as Tipo,E.NOME as Sit_Documento, G.NOME as Tomador,
           DATEADD(second, DATEDIFF(second, 0, a.HORAEMISSAO), CAST(a.dataemissao as datetime)) AS Dt_Emissao, C.DATAINCLUSAO as Dt_Faturado,

    DATEDIFF(MINUTE,DATEADD(second, DATEDIFF(second, 0, a.HORAEMISSAO), CAST(a.dataemissao as datetime)),C.DATAINCLUSAO) as Tempo_Minutos,

    DATEDIFF(HOUR,DATEADD(second, DATEDIFF(second, 0, a.HORAEMISSAO), CAST(a.dataemissao as datetime)),C.DATAINCLUSAO) AS Tempo_Horas

    Resultados de exemplo:

    Dt_Emissao Dt_Faturado Resultado em Minutos Resultado em Horas

    2013-04-28 18:04:34.000 2013-04-30 18:41:19.000 2917 48

    Porém esta data de emissão na tabela é dia 30 e não dia 28.

    quinta-feira, 2 de maio de 2013 20:15
  • Tente fazer um teste com o script abaixo para verificar o resultado obtido:

    declare @DataEmissao date;
    set @DataEmissao = '2013-04-30';
    
    declare @HoraEmissao time;
    set @HoraEmissao= '18:04:34.000';
    
    declare @DataInclusao DateTime; 
    set @DataInclusao = '2013-05-01 18:41:19.000';
    
    select
        @DataEmissao as DataEmissao,
        @HoraEmissao as HoraEmissao,
        DATEADD(second, DATEDIFF(second, 0, @HoraEmissao), CAST(@DataEmissao as datetime)) as DataHoraEmissao,
        @DataInclusao as DataInclusao,
        DATEDIFF
            (MINUTE,
             DATEADD(second, DATEDIFF(second, 0, @HoraEmissao), CAST(@DataEmissao as datetime)),
             @DataInclusao) as Tempo_Minutos,
        DATEDIFF
            (HOUR,
             DATEADD(second, DATEDIFF(second, 0, @HoraEmissao), CAST(@DataEmissao as datetime)),
             @DataInclusao) AS Tempo_Horas
         

    Resultado:

    DataEmissao	HoraEmissao		DataHoraEmissao		DataInclusao			Tempo_Minutos	Tempo_Horas
    2013-04-30	18:04:34.0000000	2013-04-30 18:04:34.000		2013-05-01 18:41:19.000		1477		24

    Espero que seja útil. 


    Assinatura: http://www.imoveisemexposicao.com.br




    • Editado gapimex quinta-feira, 2 de maio de 2013 21:31
    quinta-feira, 2 de maio de 2013 21:27
  • Bom. Ele continua na mesma. Não sei se existe algum reflexo que resulte em cálculo errado, mas fiz o seguinte. Ao invés de 0 coloquei -2:

    select C.NUMERO as Fatura,F.NOME as Sit_Fatura, A.NUMERO as Documento,D.NOME as Tipo,E.NOME as Sit_Documento, G.NOME as Tomador,
            DATEADD(second, DATEDIFF(second, -2,A.HORAEMISSAO), CAST(A.DATAEMISSAO as datetime)) as DataHoraEmissao, C.DATAINCLUSAO as Dt_Faturado,

     DATEDIFF
            (MINUTE,
             DATEADD(second, DATEDIFF(second, -2, A.HORAEMISSAO), CAST(A.DATAEMISSAO as datetime)),
             C.DATAINCLUSAO) as Tempo_Minutos,

     DATEDIFF
            (HOUR,
             DATEADD(second, DATEDIFF(second, -2, A.HORAEMISSAO), CAST(A.DATAEMISSAO as datetime)),
             C.DATAINCLUSAO) as Tempo_Horas

    Uma informação que acho que pode ser a origem do problema. Na data de origem, aquela que concatenamos, existem duas datas. A primeira que é a A.DATAEMISSAO, que sempre vai estar na tabela com os valores de hora zerados, ou seja, exemplo: 2013-04-06 00:00:00.000. Na A.HORAEMISSAO sempre vai estar na tabela com a mesma data e somente a hora é que vale, exemplo: 1899-12-30 11:41:27.000.

    Será que é isto que esta dando essa diferença de 2 dias sempre?

    sexta-feira, 3 de maio de 2013 14:24
  • Experimente dessa forma:

    select 
        C.NUMERO as Fatura,
        F.NOME as Sit_Fatura, 
        A.NUMERO as Documento,
        D.NOME as Tipo,
        E.NOME as Sit_Documento, 
        G.NOME as Tomador,
        DATEADD(second, DATEDIFF(second, '1899-12-30', A.HORAEMISSAO), A.DATAEMISSAO) as DataHoraEmissao, 
        C.DATAINCLUSAO as Dt_Faturado,
        DATEDIFF
            (MINUTE,
             DATEADD(second, DATEDIFF(second, '1899-12-30', A.HORAEMISSAO), A.DATAEMISSAO),
             C.DATAINCLUSAO) as Tempo_Minutos,
        DATEDIFF
            (HOUR,
             DATEADD(second, DATEDIFF(second, '1899-12-30', A.HORAEMISSAO), A.DATAEMISSAO),
             C.DATAINCLUSAO) as Tempo_Horas

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 3 de maio de 2013 17:11
  • Mensagem 242, Nível 16, Estado 3, Linha 1
    A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo.
    sexta-feira, 3 de maio de 2013 18:20
  • Tente adaptar o formato da data ('1899-12-30') para o formato utilizado pelo seu servidor, ou utilize o -2 mesmo no código.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 3 de maio de 2013 19:00
  • Deleted
    • Marcado como Resposta Giovani Cr quarta-feira, 9 de outubro de 2013 20:29
    sexta-feira, 3 de maio de 2013 23:06