ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Mysql mudar para firebird[RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
salomao.coelho
Aprendiz
Aprendiz


Registrado: Terça-Feira, 3 de Fevereiro de 2004
Mensagens: 120
Localização: Comendo Queijo (interior de Minas)

MensagemEnviada: Sáb Set 02, 2017 12:28 pm    Assunto: Mysql mudar para firebird[RESOLVIDO] Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sáb Set 02, 2017 4:35 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
salomao.coelho
Aprendiz
Aprendiz


Registrado: Terça-Feira, 3 de Fevereiro de 2004
Mensagens: 120
Localização: Comendo Queijo (interior de Minas)

MensagemEnviada: Sáb Set 02, 2017 5:04 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
salomao.coelho
Aprendiz
Aprendiz


Registrado: Terça-Feira, 3 de Fevereiro de 2004
Mensagens: 120
Localização: Comendo Queijo (interior de Minas)

MensagemEnviada: Sáb Set 02, 2017 6:53 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Dom Set 03, 2017 12:02 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB