none
Jornada de trabalho... Carga Horaria

    Pregunta

  • Olá amigo...
    Qual a melhor type do sql server 2005 para gravar horas e depois manipular com calculos?

    Tenho uma tabela funcional nessa tabela tem um campo chamado HoraSemanal que tem funcionarios com valores calculados de outra tabela 40, 20, 6:30  horas de trabalho semanal
    Tenho outra tabela com as unidade funcional de trabalho do funcionario...
    sendo que tem outro campo de hora diaria:

    Ex:
    Tab Funcional
    Funcionario  status  cargo\funcao  horasemanal
    xxxxx              3              23               40:00   <= ( (4:30+3:30) *5) )

    Tab Unidade Funcional
    Funcionario  UF  HoraDiaria
    xxxxx            1        4:30
    xxxxx            2        3:30
    yyyyy            2        8:00
    zzzzz             1        6:30

    enfim qual melhor type do sql server 2005 para horas em que eu possa fazer calculos com essas horas
    Varchar? decimal(2,2)? smalldatetime?

    como fica a soma de horas com o type sugerido???


    martes, 05 de junio de 2007 16:26

Todas las respuestas

  • Sharp,

     

    Você deseja acumular o separador de horas e minutos, ":"?

     

    Aqui na empresa, tenho a necessidade de fazer um cálculo de horas, para armazenar este valor eu criei um campo VarChar(6).

    martes, 05 de junio de 2007 16:44
  • Sim... Mais eu colocando como varchar e gravando no formato hh:mm

    como fica a soma de horas desse varchar?
    se eu somar por exemplo... 5:30 + 2:30 convertendo em decimal.. vai me trazer 7.60

    enfim um type para depois usar a soma de horas... como faço Junior?




    martes, 05 de junio de 2007 17:55
  • o ideal em horas quando se acumula e usar um int mesmo, pois as horas nao sao centezimais entao por exemplo se uma pessoa trabalha em um horario que comeca em um dia e termina em outro o vc. deve calcula a quantidade de minutos no periodo pela diferenca de entre a data + hora de inicio e data + hora de fim, mais se vc. nao tem esse caso eu usuario mesmo um smalldatetime para armazenar a hora despresando o dia se nao vc. vai ter que converter para horas para poder calcular e isso pode custar processamento veja este exemplo

     

    Declare @HoraInicial char(05)
    Declare @HoraFinal char(05)

    Select @HoraInicial = '5:30', @HoraFinal = '2:30'

    Select Convert(Datetime, @HoraInicial, 14) +  Convert(Datetime, @HoraFinal, 14)

     

    qualquer coisa retorne.

     

    Abs;

    miércoles, 06 de junio de 2007 10:20
  • Então Marcelo.. no meu caso é um seguinte.. os funcinários são medicos!

    Um medico Xxx faz por exemplo 4:30 em clinica geral e 3:30 em  laboratorio

    ou seja não tenho um inicio e um fim tenho cargahorario dia por "departamentos" digamos assim..


    o que tenho que fazer é armazenar quantas horas cada medico faz em um departamento.. depois pegar todos esses horarios e somar multiplicando por cinco para saber qual a jornada de trabalho desse médico por semana..


    é como a tabela abaixo:

    Ex:
    Tab Funcional
    Funcionario  status  cargo\funcao  horasemanal
    xxxxx              3              23               40:00   <= ( (4:30+3:30) *5) ) pegando os valores da tabela de unidade funcional

    Tab Unidade Funcional
    Funcionario  UF  HoraDiaria
    xxxxx            1        4:30
    xxxxx            2        3:30
    yyyyy            2        8:00
    zzzzz             1        6:30


    qual type utilizo no sql server para depois somar.. multiplicar esses horarios..
     smalldatetime tem que colocar uma data se colocar varchar posso converter em horas para depois somar e multiplicar essas horas?


    miércoles, 06 de junio de 2007 17:49
  • na verdade ainda fiz errado minha pergunta..

    quando dou o select na tab Unidade funcional..
    select funcionario, horadiaria from tabunidadefuncional where funcionario = 'xxx'

    ele retornar seguindo a tab no post acima

    funcionario HoraDiaria
    xxxxx          4:30
    xxxxx          3:30

    eu preciso somar essas horas desse funcionario e multiplicar por cinco para ter a jornada semanal dele...

    miércoles, 06 de junio de 2007 18:09
  • Sharp,

    desculpe se pareço pretencioso, mas fiz 4 exemplos que vc pode estar usando... na verdade tb existem outras formas de fazer a mesma coisa. Espero que te ajude.

    ----------------------------------------------------------------------
    --SOLUÇÃO 1:
    create table funcionario_tb
            (funcionario_id int not null,
            horario varchar(4) not null)
    insert into funcionario_tb(funcionario_id,horario)values(1,'0430')
    insert into funcionario_tb(funcionario_id,horario)values(1,'0330')
    insert into funcionario_tb(funcionario_id,horario)values(2,'0800')
    insert into funcionario_tb(funcionario_id,horario)values(3,'0600')

    select funcionario_id, cast((sum(minutos) / 60) as varchar(3)) + ':' + cast((sum(minutos) % 60) as varchar(2))
    from (
    select funcionario_id,
    --descobre o número de horas:
    --completa com zeros o horário, pega os 2 primeiros números, converte para int e multiplica por 60 minutos
    (cast(substring((replicate('0', 4 - len(horario)) + horario), 1, 2) as int) * 5 * 60)
    --soma
    +
    --descobre a quantidade de minutos
    (cast(substring((replicate('0', 4 - len(horario)) + horario), 3, 4) as int) * 5) as minutos
    from funcionario_tb) a
    group by a.funcionario_id
    ----------------------------------------------------------------------
    --SOLUÇÃO 2:
    create table funcionario_tb
            (funcionario_id int not null,
            horario varchar(4) not null,
            minutos as
                (cast(substring((replicate('0', 4 - len(horario)) + horario), 1, 2) as int) * 5 * 60)
                +
                (cast(substring((replicate('0', 4 - len(horario)) + horario), 3, 4) as int) * 5)
            )
    insert into funcionario_tb(funcionario_id,horario)values(1,'0430')
    insert into funcionario_tb(funcionario_id,horario)values(1,'0330')
    insert into funcionario_tb(funcionario_id,horario)values(2,'0800')
    insert into funcionario_tb(funcionario_id,horario)values(3,'0600')

    select funcionario_id, cast((sum(minutos) / 60) as varchar(3)) + ':' + cast((sum(minutos) % 60) as varchar(2))
    from funcionario_tb a
    group by a.funcionario_id
    ----------------------------------------------------------------------
    --SOLUÇÃO 3:
    create table funcionario_tb
            (funcionario_id int not null,
            hora tinyint not null,
            minuto tinyint not null,
            minutos as
                (hora * 5 * 60)
                +
                (minuto * 5)
            )

    insert into funcionario_tb(funcionario_id,hora,minuto)values(1,4,30)
    insert into funcionario_tb(funcionario_id,hora,minuto)values(1,3,30)
    insert into funcionario_tb(funcionario_id,hora,minuto)values(2,8,0)
    insert into funcionario_tb(funcionario_id,hora,minuto)values(3,6,0)

    select funcionario_id, cast((sum(minutos) / 60) as varchar(3)) + ':' + cast((sum(minutos) % 60) as varchar(2))
    from funcionario_tb a
    group by a.funcionario_id

    ----------------------------------------------------------------------
    --SOLUÇÃO 4:
    create table funcionario_tb
            (funcionario_id int not null,
            horario smalldatetime not null,
            minutos as
                (datepart(hh,horario)  * 5 * 60)
                +
                (datepart(mi,horario) * 5)
            )

    insert into funcionario_tb(funcionario_id,horario)values(1,'04:30')
    insert into funcionario_tb(funcionario_id,horario)values(1,'03:30')
    insert into funcionario_tb(funcionario_id,horario)values(2,'08:00')
    insert into funcionario_tb(funcionario_id,horario)values(3,'06:00')

    select funcionario_id, cast((sum(minutos) / 60) as varchar(3)) + ':' + cast((sum(minutos) % 60) as varchar(2))
    from funcionario_tb a
    group by a.funcionario_id

    Todas tem prós e contras... avalie a melhor solução para vc, ok?

    Abraço,
    Gesiel
    jueves, 07 de junio de 2007 23:29