none
Converter Valor Numérico em Horas Ex: 17,24 em 17:24 RRS feed

  • Pergunta

  • Bom dia,

    Estou com um problema em uma função que estou desenvolvendo, no meu banco tenho um campo NUMERICO com a informação de hora de saída de funcionário, preciso pegar essa informação transformar em horas e depois subtrair essas horas com um outro campo de data/hora.

    Ex: Tenho a informação 17,24 - preciso converter em horas ficando em 17:24 e depois subtrair com outro campos de data e hora.

    Obs. O problema maior esta sendo na conversão do numérico em horas, pq a subtração das horas já consegui.

    Por favor me ajudem!

    Obrigado! 

    Segue Função Abaixo:

    ALTER FUNCTION [dbo].[fu_clt_calchoraextra] 
    (

    @pe_horasaida datetime,
    @pe_horaentra datetime,
    @pe_faixasaida datetime,
    @pe_diasemana varchar(1)

    )
    RETURNS VARCHAR(50)
    AS
    BEGIN

    Declare @Retorno time,
    @HSaida datetime,
    @HEntra datetime,
    @FSaida datetime,
    @DSemana varchar(1)

    Set @HSaida = @pe_horasaida
    Set @HEntra =   @pe_horaentra
    Set @FSaida = cast(replace(@pe_faixasaida,',',':') as time) --cast(replace(@FSaida,',',':') as time)
    Set @DSemana = 'S'--@pe_diasemana

    if @DSemana = 'S'
    begin
    if Cast(@HSaida as time) > Cast(@FSaida as time)
    begin
    Set @Retorno = @HSaida - @FSaida
    end
    else
    begin
    Set @Retorno = '00:00:00'
    end
    end
    else
    begin
    Set @Retorno = @HSaida - @HEntra
    end

    RETURN @Retorno

    END

    segunda-feira, 22 de junho de 2015 12:56

Respostas

Todas as Respostas

  • Bom dia,

    Experimente fazer um teste com o script abaixo:

    declare @HoraNum numeric(5, 2);
    set @HoraNum = 17.24;
    
    declare @DataHora datetime;
    set @DataHora = '20150622 10:15';
    
    select 
        DATEADD
            (HOUR, 
             - floor(@HoraNum), 
             DATEADD
                 (MINUTE, 
                 - (@HoraNum - floor(@HoraNum)) * 100, 
                 @DataHora))

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 22 de junho de 2015 13:16
  • BeGabrielSJC,

    Como seus dados de horários estão armazenados com valores numéricos, acredito que foi implementado uma lógica para manipular este horário como "centesimal".

    Neste caso, os minutos são fracionados "00:30" (meia noite e meia) é equivalente à "0,50"; "00:15" é equivalente à "0,25" e "00:45" é equivalente à "0,75".

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    SELECT CAST(DATEADD(SECOND, (11.50 * 3600), '00:00:00') AS TIME(0)) AS HS 
    

    Uma pergunta semelhante à sua já foi respondida neste Fórum, veja:

    https://social.msdn.microsoft.com/Forums/sqlserver/pt-BR/ab013d39-34ad-41cb-a29e-dc9240511a6a/converter-tempo-frao-em-hora?forum=520


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta begabrielsjc segunda-feira, 22 de junho de 2015 14:11
    • Não Marcado como Resposta begabrielsjc segunda-feira, 22 de junho de 2015 14:11
    segunda-feira, 22 de junho de 2015 13:26
    Moderador
  • Bom dia!!!

    Obrigado pela resposta, para a subtração funcionou perfeitamente, mas o problema agora é como vou saber qual é a hora maior? Porque só vou fazer a subtração das horas se esta hora 17,24 for menor.

    Sabe me dizer?

    Teria agora que converter a hora agora em numérico para ver qual é a maior? sabe me dizer?

    Obrigado!

    segunda-feira, 22 de junho de 2015 13:47
  • Durval,

    O Problema maior é este,  não foi gravado no banco como centesimal, ou seja 17,24 equivale a 17:24 (17 horas e 24 minutos).

    Obrigado!

    segunda-feira, 22 de junho de 2015 14:15
  • Experimente fazer um teste:

    declare @HoraNum numeric(5, 2);
    set @HoraNum = 17.24;
    
    select 
        CAST
            (DATEADD
                (HOUR, 
                 floor(@HoraNum), 
                 DATEADD
                     (MINUTE, 
                      (@HoraNum - floor(@HoraNum)) * 100, 
                      0)) AS TIME)

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta begabrielsjc segunda-feira, 22 de junho de 2015 14:38
    segunda-feira, 22 de junho de 2015 14:18
  • Gapimex,

    Obrigado deu certo!!!

    segunda-feira, 22 de junho de 2015 16:25