GARANTIR DESCONTO

Fórum Calculando Datas no SQL #530345

01/09/2015

0

Bom dia Prezado(s),

Tenh um banco Firebird e utilizo um software onde consigo manipular as consulta via sql ao banco de dados e preciso de ajuda na seguinte questão:

Tenho duas tabelas, "ORDSERV" E "ORDXFUN" e duas colunas de datas "ORDSERV.DATPRO" E "ORDXFUN.DATHORINI". A coluna ORDSERV.DATPRO, possui um uma única data, porém, pode ser edita caso seja necessário, e a coluna ORDXFUN.DATHORINI possui várias datas, sendo assim, preciso retornar diferença entre ORDSERV.DATPRO e o primeiro registro da ORDXFUN.DATHORINI e o resultado deverá mostrar as horas e os minutos entre as datas.
João Cristo

João Cristo

Responder

Posts

01/09/2015

Fabio Basso

O datediff retorna a diferença entre uma data e outra. Essa diferença pode ser em anos, meses ou dias.

select datediff ( day, ORDSERV.DATPRO, ORDXFUN.DATHORINI)

Para pegar o primeiro registro da ORDXFUN.DATHORINI acho que vc consegue resolver com um select max
Responder

Gostei + 0

01/09/2015

João Cristo

Obrigado pela resposta Fabio, não tenho muita noção de como montar a consulta e preciso que o resultado retorne as horas e os minutos entre as datas.

Tentei algo como:

DATEDIFF(HOUR, ORDSERV.DATPRO, MIN (ORDXFUN.DATHORINI))

porém, só consegui o retorno em horas e preciso dos minutos, pois entre as dadas podem ter ambas situações.
Responder

Gostei + 0

01/09/2015

Fabio Basso

select datediff (hour, ORDSERV.DATPRO, ORDXFUN.DATHORINI) || '-' ||mod(datediff (minute, ORDSERV.DATPRO, ORDXFUN.DATHORINI), 60) as tempototal,
Responder

Gostei + 0

01/09/2015

João Cristo

é possível configurar para que o resultado seja no formato: HH:MM ?
Responder

Gostei + 0

01/09/2015

Fabio Basso

Eu postei o SQL e tive que sair, por isso não expliquei nada.
O bloco || ' - ' || faz a concatenção do resultado, então vc pode substituir o ' - ' por ':'
O operador || concatena colunas. Você pode testar isso com outros campos, por exemplo: select codigo_cli || ', ' || nome_cli from tb_cliente;

A função mod(x, y) retorna o resto da divisão de x por y.

Att.
Responder

Gostei + 0

01/09/2015

João Cristo

Consegui entender Fabio, me ajudou bastante, porém, reparei que o resultado retorna vários zeros como no exemplo 18:49.00000000000000, exista alguma função para arredondar este valor ?
Responder

Gostei + 0

01/09/2015

Fabio Basso

O tipo de dado destes campos é Double? No banco de teste que eu montei não gerou esse valor com zeros. Você tentar fazer um cast pra ver se resolve o problema. Se puder mande-me a estrutura desta tabela para fazer um teste.
Responder

Gostei + 0

01/09/2015

João Cristo

Sim, o padrão é DOUBLE e em exceções em TIMESTAMP.
Responder

Gostei + 0

01/09/2015

Fabio Basso

Então usando o cast deve funcionar.
http://pt.stackoverflow.com/questions/3455/formatar-casas-decimais-diretamente-no-comando-sql-em-firebird
Responder

Gostei + 0

01/09/2015

João Cristo

Seria está consulta?

CAST(REPLACE(datediff(hour, ORDSERV.DATPRO, ORDXFUN.DATHORINI) || ':' ||mod(datediff (minute, ORDSERV.DATPRO, ORDXFUN.DATHORINI), 60)) as tempototal

Outra situação foi que no resultado não apresentou apenas o primeiro registro da ORDXFUN:

[img]http://arquivo.devmedia.com.br/forum/imagem/451341-20150901-160604.jpg[/img]
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar