 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
salomao.coelho Aprendiz

Registrado: Terça-Feira, 3 de Fevereiro de 2004 Mensagens: 120 Localização: Comendo Queijo (interior de Minas)
|
Enviada: Sáb Set 02, 2017 12:28 pm Assunto: Mysql mudar para firebird[RESOLVIDO] |
|
|
tenho uma aplicação que uso o Mysql e estou migrando para o firebird, mas quando faço esta condulta
| Código: | select "Cod_funcionario", dsData,
time_format(sec_to_time(sum(time_to_sec(dsHoraTrabalhada))),'%H:%i:%s') AS totalHoraTrabalhada, time_format(sec_to_time(sum(time_to_sec(dsHoraExtra))),'%H:%i:%s') AS totalHoraExtra,
time_format(sec_to_time(sum(time_to_sec(dsHoraMenor))),'%H:%i:%s') AS totalHoraMenor
from ("tfuncionario" join "thorastrabalhadas" on(("tfuncionario".CDFUNCIONARIO = "Cod_funcionario")))
where (dsdata between 01/07/2017 and 31/07/2017) and "Cod_funcionario"= 1
group by "Cod_funcionario"
order by "tfuncionario".DSNOME,dsData
|
no Mysql funciona perfeito.
no Firebird apresenta erro:
| Código: | Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -804
Function unknown
TIME_FORMAT |
alguem sabe como resolver
Editado pela última vez por salomao.coelho em Sáb Set 02, 2017 6:52 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Set 02, 2017 4:35 pm Assunto: |
|
|
Boa tarde,
Não tenho nenhuma experiência com o MySQL mas pelo que entendi a função Time_Format converte um campo do tipo Time para Varchar, e o restante ( sec_to_time(sum(time_to_sec(campo))) ) foi utilizado para somar as horas.
Acredito que não exista uma função equivalente a Time_Format do MySQL no Firebird, mas experimente utilizar as funções Left e Cast para ver se é obtido o mesmo resultado:
| Código: | left( cast( sum( datediff(second, time '00:00', dsHoraTrabalhada) ) as varchar(20)), 8 ) AS totalHoraTrabalhada,
left( cast( sum( datediff(second, time '00:00', dsHoraExtra) ) as varchar(20)), 8 ) AS totalHoraExtra,
left( cast( sum( datediff(second, time '00:00', dsHoraMenor) ) as varchar(20)), 8 ) AS totalHoraMenor |
Espero que ajude
Editado pela última vez por imex em Dom Out 01, 2023 4:14 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
salomao.coelho Aprendiz

Registrado: Terça-Feira, 3 de Fevereiro de 2004 Mensagens: 120 Localização: Comendo Queijo (interior de Minas)
|
Enviada: Sáb Set 02, 2017 5:04 pm Assunto: |
|
|
| imex escreveu: | Boa tarde,
Não tenho nenhuma experiência com o MySQL mas pelo que entendi a função Time_Format converte um campo do tipo Time para Varchar, e o restante ( sec_to_time(sum(time_to_sec(campo))) ) foi utilizado para somar as horas.
Acredito que não exista uma função equivalente a Time_Format do MySQL no Firebird, mas experimente utilizar as funções Left e Cast para ver se é obtido o mesmo resultado:
| Código: | left( cast( sum( datediff(second, time '00:00', dsHoraTrabalhada) ) as varchar(20)), 8 ) AS totalHoraTrabalhada,
left( cast( sum( datediff(second, time '00:00', dsHoraExtra) ) as varchar(20)), 8 ) AS totalHoraExtra,
left( cast( sum( datediff(second, time '00:00', dsHoraMenor) ) as varchar(20)), 8 ) AS totalHoraMenor |
Espero que ajude
|
apresentou erro:
| Código: | Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) |
| Código: | select "Cod_funcionario", "tfuncionario".DSNOME, "tfuncionario".CDFUNCAO, dsData,
left(cast(sum(datediff(second,time '00:00',dsHoraTrabalhada)) as varchar(20)),8) AS totalHoraTrabalhada,
left(cast(sum(datediff(second,time '00:00',dsHoraExtra)) as varchar(20)),8) AS totalHoraExtra,
left(cast(sum(datediff(second,time '00:00',dsHoraMenor)) as varchar(20)),8) AS totalHoraMenor
from ("tfuncionario" join "thorastrabalhadas" on(("tfuncionario".CDFUNCIONARIO = "Cod_funcionario")))
where dsdata between '2016.07.01' and '2016.07.31' and "Cod_funcionario"=1 |
já coloquei a a clausula
| Código: | | group by "Cod_funcionario" |
apresenta o mesmo erro |
|
| Voltar ao Topo |
|
 |
salomao.coelho Aprendiz

Registrado: Terça-Feira, 3 de Fevereiro de 2004 Mensagens: 120 Localização: Comendo Queijo (interior de Minas)
|
Enviada: Sáb Set 02, 2017 6:53 pm Assunto: |
|
|
| salomao.coelho escreveu: | | imex escreveu: | Boa tarde,
Não tenho nenhuma experiência com o MySQL mas pelo que entendi a função Time_Format converte um campo do tipo Time para Varchar, e o restante ( sec_to_time(sum(time_to_sec(campo))) ) foi utilizado para somar as horas.
Acredito que não exista uma função equivalente a Time_Format do MySQL no Firebird, mas experimente utilizar as funções Left e Cast para ver se é obtido o mesmo resultado:
| Código: | left( cast( sum( datediff(second, time '00:00', dsHoraTrabalhada) ) as varchar(20)), 8 ) AS totalHoraTrabalhada,
left( cast( sum( datediff(second, time '00:00', dsHoraExtra) ) as varchar(20)), 8 ) AS totalHoraExtra,
left( cast( sum( datediff(second, time '00:00', dsHoraMenor) ) as varchar(20)), 8 ) AS totalHoraMenor |
Espero que ajude
|
apresentou erro:
| Código: | Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) |
| Código: | select "Cod_funcionario", "tfuncionario".DSNOME, "tfuncionario".CDFUNCAO, dsData,
left(cast(sum(datediff(second,time '00:00',dsHoraTrabalhada)) as varchar(20)),8) AS totalHoraTrabalhada,
left(cast(sum(datediff(second,time '00:00',dsHoraExtra)) as varchar(20)),8) AS totalHoraExtra,
left(cast(sum(datediff(second,time '00:00',dsHoraMenor)) as varchar(20)),8) AS totalHoraMenor
from ("tfuncionario" join "thorastrabalhadas" on(("tfuncionario".CDFUNCIONARIO = "Cod_funcionario")))
where dsdata between '2016.07.01' and '2016.07.31' and "Cod_funcionario"=1 |
já coloquei a a clausula
| Código: | | group by "Cod_funcionario" |
apresenta o mesmo erro |
\
FUNCIONOU DESSA MANEIRA:
| Código: | SELECT
CASE when (dsHoraTrabalhada/3600) < 10 then '0'||(dsHoraTrabalhada/3600)
else (dsHoraTrabalhada/3600) end ||':'||
CASE when ((dsHoraTrabalhada-((dsHoraTrabalhada)/3600)*3600)/60) < 10 then
'0'||((dsHoraTrabalhada-((dsHoraTrabalhada)/3600)*3600)/60)
else ((dsHoraTrabalhada-((dsHoraTrabalhada)/3600)*3600)/60) end as totalHoraTrabalhada,
CASE when (dsHoraExtra/3600) < 10 then '0'||(dsHoraExtra/3600)
else (dsHoraExtra/3600) end ||':'||
CASE when ((dsHoraExtra-((dsHoraExtra)/3600)*3600)/60) < 10 then
'0'||((dsHoraExtra-((dsHoraExtra)/3600)*3600)/60)
else ((dsHoraExtra-((dsHoraExtra)/3600)*3600)/60) end as TotalHorasExtra,
CASE when (dsHoraMenor/3600) < 10 then '0'||(dsHoraMenor/3600)
else (dsHoraMenor/3600) end ||':'||
CASE when ((dsHoraMenor-((dsHoraMenor)/3600)*3600)/60)< 10 then
'0'||((dsHoraMenor-((dsHoraMenor)/3600)*3600)/60)
else ((dsHoraMenor-((dsHoraMenor)/3600)*3600)/60) end as TotalHoraMenor
FROM(
SELECT
CAST(SUM(
EXTRACT( HOUR FROM dsHoraTrabalhada ) * 3600 +
EXTRACT( MINUTE FROM dsHoraTrabalhada ) * 60 +
EXTRACT( SECOND FROM dsHoraTrabalhada )
) AS INTEGER) AS dsHoraTrabalhada,
CAST(SUM(
EXTRACT( HOUR FROM dsHoraExtra ) * 3600 +
EXTRACT( MINUTE FROM dsHoraExtra ) * 60 +
EXTRACT( SECOND FROM dsHoraExtra )
) AS INTEGER) AS dsHoraExtra,
CAST(SUM(
EXTRACT( HOUR FROM dsHoraMenor ) * 3600 +
EXTRACT( MINUTE FROM dsHoraMenor ) * 60 +
EXTRACT( SECOND FROM dsHoraMenor )
) AS INTEGER) AS dsHoraMenor
FROM "thorastrabalhadas"
where dsdata between '2016.07.01' and '2016.07.31' and "Cod_funcionario"=1) |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Dom Set 03, 2017 12:02 pm Assunto: |
|
|
| salomao.coelho escreveu: | apresentou erro:
| Código: | Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) |
| Código: | select "Cod_funcionario", "tfuncionario".DSNOME, "tfuncionario".CDFUNCAO, dsData,
left(cast(sum(datediff(second,time '00:00',dsHoraTrabalhada)) as varchar(20)),8) AS totalHoraTrabalhada,
left(cast(sum(datediff(second,time '00:00',dsHoraExtra)) as varchar(20)),8) AS totalHoraExtra,
left(cast(sum(datediff(second,time '00:00',dsHoraMenor)) as varchar(20)),8) AS totalHoraMenor
from ("tfuncionario" join "thorastrabalhadas" on(("tfuncionario".CDFUNCIONARIO = "Cod_funcionario")))
where dsdata between '2016.07.01' and '2016.07.31' and "Cod_funcionario"=1 |
já coloquei a a clausula
| Código: | | group by "Cod_funcionario" |
apresenta o mesmo erro |
No Firebird é necessário colocar todos os campos do Select que não estão dentro de funções de agregação (ex: Sum, Min, Max, etc) no Group By. Segue outra sugestão para teste:
| Código: | select "Cod_funcionario", "tfuncionario".DSNOME, "tfuncionario".CDFUNCAO, dsData,
left(cast(dateadd(second, sum(datediff(second,time '00:00',dsHoraTrabalhada)), 0) as varchar(20)),8) AS totalHoraTrabalhada,
left(cast(dateadd(second, sum(datediff(second,time '00:00',dsHoraExtra)), 0) as varchar(20)),8) AS totalHoraExtra,
left(cast(dateadd(second, sum(datediff(second,time '00:00',dsHoraMenor)), 0) as varchar(20)),8) AS totalHoraMenor
from ("tfuncionario" join "thorastrabalhadas" on(("tfuncionario".CDFUNCIONARIO = "Cod_funcionario")))
where dsdata between '2016.07.01' and '2016.07.31' and "Cod_funcionario"=1
Group By "Cod_funcionario", "tfuncionario".DSNOME, "tfuncionario".CDFUNCAO, dsData |
Acho que essa última query que você postou funcionou porque todos os campos do Select estão dentro de funções de agregação.
Espero que seja útil |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|