soma de 2 campos data e hora [Resolvido]

bom dia

estou com 2 campos data e hora e gostaria de fazer a subtração enter os 2 para me retornar um valor das horas trabalhadas de um funcionário.
já tentei através das macros mias não esta dando muito certo.

agradeço se alguém puder me dar uma ajuda.

Qual o banco de dados?
Não dá pra usar as funções de data do banco?

informe como vc utilizou?

Você tem 2 campos, onde cada um é do tipo datetime?

sim são 2 campos data/time (timestamp do postgres)

eu quero por exemplo:
pegar a data e hora que o funcionário começou um trabalho e a data e hora que eles acabou o trabalho e encontrar um tempo total

inicio: 11/05/2015 às 07:40, fim: 12/05/2015 às 10:55 então meu total de horas para concluir o trabalho foi 27:15

Já faz muito tempo que usei o postgres, mas acho que assim funciona:
SELECT Data1, Data2, Data2 - Data1 AS Diferenca FROM Tabela

Qual versão do teu banco ? acima do 9 ?

Tente assim:

SELECT (EXTRACT(EPOCH FROM ‘2015-02-13 17:00:00’::TIMESTAMP) -
EXTRACT(EPOCH FROM ‘2015-01-10 08:00:00’::TIMESTAMP)) / 3600;

–Em termos de semântica, a diferença entre duas datas é um intervalo, e não uma data:

select ‘2015-02-13 17:58:00’::timestamp(0) - ‘2015-02-13 12:30:00’::timestamp(0);
– 05:28:00
–(1 row)

–Você pode converter o resultado de intervalo para outro formato se quiser:
select extract(epoch from ‘2015-02-13 17:58:00’::timestamp(0) - ‘2015-02-13 12:30:00’::timestamp(0))/3600;
– 5.46666666666667
–(1 row)

Att,
Paulo.

Use a própria macro do sc… sc_time_diff

{diferencas} = sc_time_diff (“2012-07-25 05:33:45”, “yyyy-mm-dd hh:ii:ss”, “2012-07-21 15:22:57”, “yyyy-mm-dd hh:ii:ss”);

substitua as datas acima pelos campos

{diferencas[0]} seria igual a 86 (horas)
{diferencas[1]} seria igual a 10 (minutos)
{diferencas[2]} seria igual a 48 (segundos).

bom dia

sim antes de entrar no forum eu tentei essa macro varias vezes
mais não esta completando o campo para o qual eu estou mandando ela

{hora_total} = sc_time_diff ({datahora2}, “ddmmaaaa hhmmss”, {datahora1}, “ddmmaaaa hhmmss”);

e tambem troquei só com hora

{hora_total} = sc_time_diff ({hora2}, “hhmmss”, {hora1}, “hhmmss”);

e mesmo assim me retorna o campo em branco

Estas aplicando de forma errada, veja o exemplo que colocou o Rodrigo

fiz tampem com o formato dele e me retorna “Array”

vou fazer via sql como o paulo e o allan me cogeriram

$check_sql = “select hora_fim::time - hora_ini::time as diferenca”
. " FROM ast.manutencao_tempos"
. " WHERE id = ‘" . {id} . "’";
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]}))
{
{hora_total} = {rs[0][0]};

}

obrigado pela ajuda

Caro Alexandre

O Retorno da macro é um Array mesmo, o mesmo terá na posição {0} a hora, {1} minuto e {2} segundos! Para pegar o valor você deverá fazer assim, no caso imprimir na tela:
echo {diferencas[0]}.":".{diferencas[1]}.":". {diferencas[2]};

Se for usar em outro campo formatado, você deverá completar a string antes de enviar, usado a função str_pad do PHP, então ficaria assim:

$total = sc_time_diff ({datahora2}, “hh:ii:ss”, {datahora1}, “hh:ii:ss”);
[size=14pt]{hora_total}[/size] = str_pad($total[0], 2, “0”, STR_PAD_LEFT).":".str_pad($total[1], 2, “0”, STR_PAD_LEFT).":".str_pad($total[2], 2, “0”, STR_PAD_LEFT);

Espero ter esclarecido, até mais