Calculando Datas no SQL
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.
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
Curtidas 0
Respostas
Fabio Basso
01/09/2015
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
select datediff ( day, ORDSERV.DATPRO, ORDXFUN.DATHORINI)
Para pegar o primeiro registro da ORDXFUN.DATHORINI acho que vc consegue resolver com um select max
GOSTEI 0
João Cristo
01/09/2015
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.
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.
GOSTEI 0
Fabio Basso
01/09/2015
select datediff (hour, ORDSERV.DATPRO, ORDXFUN.DATHORINI) || '-' ||mod(datediff (minute, ORDSERV.DATPRO, ORDXFUN.DATHORINI), 60) as tempototal,
GOSTEI 0
João Cristo
01/09/2015
é possível configurar para que o resultado seja no formato: HH:MM ?
GOSTEI 0
Fabio Basso
01/09/2015
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.
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.
GOSTEI 0
João Cristo
01/09/2015
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 ?
GOSTEI 0
Fabio Basso
01/09/2015
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.
GOSTEI 0
João Cristo
01/09/2015
Sim, o padrão é DOUBLE e em exceções em TIMESTAMP.
GOSTEI 0
Fabio Basso
01/09/2015
Então usando o cast deve funcionar.
http://pt.stackoverflow.com/questions/3455/formatar-casas-decimais-diretamente-no-comando-sql-em-firebird
http://pt.stackoverflow.com/questions/3455/formatar-casas-decimais-diretamente-no-comando-sql-em-firebird
GOSTEI 0
João Cristo
01/09/2015
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]
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]
GOSTEI 0