Usuário com melhor resposta
Consulta SQL com DATADIFF com campos concatenados

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
WHEREA.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
Respostas
-
Deleted
- Marcado como Resposta Giovani Cr quarta-feira, 9 de outubro de 2013 20:29
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
- Editado gapimex segunda-feira, 29 de abril de 2013 18:35
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 30 de abril de 2013 19:26
-
-
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
-
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.
-
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
-
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_HorasUma 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?
-
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
-
-
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
-
Deleted
- Marcado como Resposta Giovani Cr quarta-feira, 9 de outubro de 2013 20:29