none
diferença entre datas RRS feed

  • Pergunta

  • Olá Pessoal ! Preciso de uma ajuda.

    Preciso retornar as horas, minutos e segundos como implementar? Usei o detediff mas não deu certo, pois se o funcionário entrou para trabalhar as 06:00 e saiu as 14:10 do mesmo dia , então eu precisaria que retornesse a diferença no caso seria 8:10, porém usando o datediff ele me retorna somente 8.Como posso resolver ?

    Abraços.

    quarta-feira, 31 de outubro de 2012 19:47

Respostas

  • Esse assunto pode não ser tão simples. Pode envolver horário de almoço, hora extra, etc.

    Porém, é um assunto altamente recorrente aqui no fórum. Dessa forma, recomendo fazer uma pesquisa com as palavras "Cálculo de horas", aqui mesmo no fórum. Encontrará diversas soluções.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Ferreira _Moderator quinta-feira, 1 de novembro de 2012 00:28
    • Não Sugerido como Resposta RCSud quinta-feira, 1 de novembro de 2012 12:13
    • Marcado como Resposta RCSud quinta-feira, 1 de novembro de 2012 12:13
    quinta-feira, 1 de novembro de 2012 00:28
    Moderador

Todas as Respostas

  • Boa tarde,

    As colunas que armazenam os horários são de que tipo?

    A diferença será sempre inferior a 24 horas?

    Você vai precisar do resultado em uma única coluna? Em que formato (time, int, varchar, etc)?


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

    quarta-feira, 31 de outubro de 2012 20:06
  • Esse assunto pode não ser tão simples. Pode envolver horário de almoço, hora extra, etc.

    Porém, é um assunto altamente recorrente aqui no fórum. Dessa forma, recomendo fazer uma pesquisa com as palavras "Cálculo de horas", aqui mesmo no fórum. Encontrará diversas soluções.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Ferreira _Moderator quinta-feira, 1 de novembro de 2012 00:28
    • Não Sugerido como Resposta RCSud quinta-feira, 1 de novembro de 2012 12:13
    • Marcado como Resposta RCSud quinta-feira, 1 de novembro de 2012 12:13
    quinta-feira, 1 de novembro de 2012 00:28
    Moderador
  •   Bom dia !

     Respondendo a sua pergunta:

     As colunas que armazenam  os horários são datatime...

    Sim , a diferença é inferior a 24horas

    Na verdade , dentro da linguagem faço uma instrução sql pegando esta diferença e jogando na tela , então tanto faz o tipo

    Mas o que vc sugere ?

    quinta-feira, 1 de novembro de 2012 12:12
  • Bom dia,

    Existem diversas soluções como o Roberson comentou, alem da alternativa, que talvez seja mais simples, de fazer o calculo na aplicação. 

    Segue uma sugestão (é possível adicionar uma conversão / formatação conforme for conveniente):

    declare @HoraIni datetime;
    declare @HoraFim datetime;
    
    set @HoraIni = '06:00';
    set @HoraFim = '14:10';
    
    select CAST( CAST(@HoraFim as float) - CAST(@HoraIni as float) as datetime)

    Espero que seja útil.


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

    quinta-feira, 1 de novembro de 2012 13:34
  • Boa noite,

    segue uma sugestão de script, para cálculo de horas:

    /*Cria a tabela #tmpDisponibilidade*/
    Create Table #tmpDisponibilidade
    (
    Id int identity(1,1),
    Data DateTime,
    HoraInicial DateTime,
    HoraFinal DateTime,
    Periodo Char(1)
    )
    
    /*Define a formatação para data e hora do Brasil*/
    set dateformat dmy
    
    /*Insere os horários de disponibilidade do recurso*/
    insert into #tmpDisponibilidade
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 08:00:00.000',
     '06/10/2012 12:00:00.000','A')
    
    insert into #tmpDisponibilidade
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 13:00:00.000',
     '06/10/2012 18:00:00.000','B')
    
    /*Mostra os horários que o recurso opera*/
    Select *
      from #tmpDisponibilidade
    
    /*Cria a tabela #tmpOcupado*/
    Create Table #tmpOcupado
    (
    Id int identity(1,1),
    Data DateTime,
    HoraInicial DateTime,
    HoraFinal DateTime,
    Periodo Char(1)
    )
    
    /*Insere os horários em que o recurso está atendendo*/
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 08:00:00.000',
     '06/10/2012 08:30:00.000','A')
    
    /*
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 09:00:00.000',
     '06/10/2012 09:30:00.000','A')
    */
    
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 09:30:00.000',
     '06/10/2012 10:00:00.000','A')
    
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 10:00:00.000',
     '06/10/2012 10:30:00.000','A')
    
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 14:00:00.000',
     '06/10/2012 14:30:00.000','B')
    
    insert into #tmpOcupado
    (Data,HoraInicial,
    HoraFinal,Periodo)
    values
    ('06/10/2012','06/10/2012 15:30:00.000',
     '06/10/2012 16:30:00.000','B')
    
    /*Mostra os horários que o recurso está em atendimento*/
    Select *
      from #tmpOcupado
    
    /*Cria a tabela #tmpLivreA*/
    
    Create Table #tmpLivreA
    (
    Id int identity(1,1),
    Data DateTime,
    HoraInicial DateTime,
    HoraFinal DateTime,
    Periodo Char(1)
    )
    
    /*Cria as variáveis data mínima e máxima da #tmpDisponivel do período A*/
    Declare @DataMinA_Disp DateTime
    Declare @DataMaxA_Disp DateTime
    
    /*Assina as variáveis data mínima e máxima da #tmpDisponivel do período A*/
    Select @DataMinA_Disp=Data,
           @DataMaxA_Disp=Data
      from #tmpDisponibilidade
     Where Periodo='A'
    
    /*inicia o loop principal da #tmpDisponivel A*/
    while (@DataMinA_Disp <= @DataMaxA_Disp)
    Begin --inicia loop disp A 
    
        /*Cria as variáveis HoraInicial e HoraFinal Disponível do Período A*/	
        Declare @HoraIniA_Disp DateTime
        Declare @HoraFinA_Disp DateTime
    
        /*Assina as variáveis HoraInicial e HoraFinal Disponível do Período A*/	
        Select @HoraIniA_Disp=HoraInicial,
    	   @HoraFinA_Disp=HoraFinal
          from #tmpDisponibilidade
         Where Periodo='A'
           and Data=@DataMinA_Disp
    
        /*Cria a variável Hora Inicial livre do Período A*/
        Declare @HoraIniA_Livre DateTime	
        set @HoraIniA_Livre=@HoraIniA_Disp
    
        /*inicia o loop secundário a ser comparado com os horários ocupados*/
        while (@HoraIniA_Disp <= @HoraFinA_Disp)
        Begin
    
    	/*se a hora inicial mais 1 minuto estiver ocupada: criar horário livre*/
    	IF Exists(
    	   Select 1 
                 from #tmpOcupado 
                where @HoraIniA_Disp between HoraInicial and HoraFinal)
    	Begin
    
    	    IF @HoraIniA_Disp<>@HoraIniA_Livre
    	    Begin	
                    insert into #tmpLivreA
    	        (Data,HoraInicial,
    	         HoraFinal,Periodo)
    	        values
    	        (@DataMinA_Disp,@HoraIniA_Livre,
    	         @HoraIniA_Disp,'A')
    	         --DateAdd(mi,-1,@HoraIniA_Disp),'A')
    	    End
    		
                /*Incrementa enquanto estiver ocupado*/
                WHILE Exists(
    	       Select 1 
    	         from #tmpOcupado 
    	        where @HoraIniA_Disp between HoraInicial and HoraFinal)       
    	    Begin 
                    /*incrementa 1 minuto na hora inicial disp A*/
                    set @HoraIniA_Disp = DateAdd(mi,1,@HoraIniA_Disp)
    
                    /*Assina a variável Hora Inicial livre do Período A*/
    	        set @HoraIniA_Livre = @HoraIniA_Disp
    
    	    End
    	    	
    	End
    
            /*incrementa 1 minuto na hora inicial disp A*/
            set @HoraIniA_Disp = DateAdd(mi,1,@HoraIniA_Disp)
        End
        /*finaliza o loop secundário a ser comparado com os horários ocupados*/
    
        /*se a hora inicial não estiver ocupada: criar horário livre*/
        IF Not Exists(
           Select 1 
             from #tmpOcupado 
            where @HoraIniA_Disp between HoraInicial and HoraFinal)
        Begin
            insert into #tmpLivreA
    	(Data,HoraInicial,
    	 HoraFinal,Periodo)
    	values
    	(@DataMinA_Disp,@HoraIniA_Livre,
    	 DateAdd(mi,-1,@HoraIniA_Disp),'A')
        End
    
        /*incrementa 1 dia na data mínima disp A*/
        set @DataMinA_Disp = DateAdd(dd,1,@DataMinA_Disp)
    End   --finaliza loop disp A
    /*finaliza o loop principal da #tmpDisponivel A*/
    
    /*Mostra os horários livres do Período A*/
    Select * from #tmpLivreA
    
    /*Cria a tabela #tmpLivreB*/
    
    Create Table #tmpLivreB
    (
    Id int identity(1,1),
    Data DateTime,
    HoraInicial DateTime,
    HoraFinal DateTime,
    Periodo Char(1)
    )
    
    /*Cria as variáveis data mínima e máxima da #tmpDisponivel do período B*/
    Declare @DataMinB_Disp DateTime
    Declare @DataMaxB_Disp DateTime
    
    /*Assina as variáveis data mínima e máxima da #tmpDisponivel do período B*/
    Select @DataMinB_Disp=Data,
           @DataMaxB_Disp=Data
      from #tmpDisponibilidade
     Where Periodo='B'
    
    /*inicia o loop principal da #tmpDisponivel B*/
    while (@DataMinB_Disp <= @DataMaxB_Disp)
    Begin --inicia loop disp B 
    
        /*Cria as variáveis HoraInicial e HoraFinal Disponível do Período B*/	
        Declare @HoraIniB_Disp DateTime
        Declare @HoraFinB_Disp DateTime
    
        /*Assina as variáveis HoraInicial e HoraFinal Disponível do Período B*/	
        Select @HoraIniB_Disp=HoraInicial,
    	   @HoraFinB_Disp=HoraFinal
          from #tmpDisponibilidade
         Where Periodo='B'
           and Data=@DataMinB_Disp
    
        /*Cria a variável Hora Inicial livre do Período B*/
        Declare @HoraIniB_Livre DateTime	
        set @HoraIniB_Livre=@HoraIniB_Disp
    
        /*inicia o loop secundário a ser comparado com os horários ocupados*/
        while (@HoraIniB_Disp <= @HoraFinB_Disp)
        Begin
    
    	/*se a hora inicial mais 1 minuto estiver ocupada: criar horário livre*/
    	IF Exists(
    	   Select 1 
                 from #tmpOcupado 
                where @HoraIniB_Disp between HoraInicial and HoraFinal)
    	Begin
    
    	    IF @HoraIniB_Disp<>@HoraIniB_Livre
    	    Begin	
                    insert into #tmpLivreB
    	        (Data,HoraInicial,
    	         HoraFinal,Periodo)
    	        values
    	        (@DataMinB_Disp,@HoraIniB_Livre,
    	         @HoraIniB_Disp,'B')
    	         --DateAdd(mi,-1,@HoraIniA_Disp),'B')
    	    End
    		
                /*Incrementa enquanto estiver ocupado*/
                WHILE Exists(
    	       Select 1 
    	         from #tmpOcupado 
    	        where @HoraIniB_Disp between HoraInicial and HoraFinal)       
    	    Begin 
                    /*incrementa 1 minuto na hora inicial disp B*/
                    set @HoraIniB_Disp = DateAdd(mi,1,@HoraIniB_Disp)
    
                    /*Assina a variável Hora Inicial livre do Período B*/
    	        set @HoraIniB_Livre = @HoraIniB_Disp
    
    	    End
    	    	
    	End
    
            /*incrementa 1 minuto na hora inicial disp B*/
            set @HoraIniB_Disp = DateAdd(mi,1,@HoraIniB_Disp)
        End
        /*finaliza o loop secundário a ser comparado com os horários ocupados*/
    
        /*se a hora inicial não estiver ocupada: criar horário livre*/
        IF Not Exists(
           Select 1 
             from #tmpOcupado 
            where @HoraIniB_Disp between HoraInicial and HoraFinal)
        Begin
            insert into #tmpLivreB
    	(Data,HoraInicial,
    	 HoraFinal,Periodo)
    	values
    	(@DataMinB_Disp,@HoraIniB_Livre,
    	 DateAdd(mi,-1,@HoraIniB_Disp),'B')
        End
    
        /*incrementa 1 dia na data mínima disp B*/
        set @DataMinB_Disp = DateAdd(dd,1,@DataMinB_Disp)
    End   --finaliza loop disp B
    /*finaliza o loop principal da #tmpDisponivel B*/
    
    /*Mostra os horários livres do Período B*/
    Select * from #tmpLivreB
    
    /*Junta as tabelas mostrando os horários livres e ocupados*/
    Select *,
           'Livre' as Situacao
      from #tmpLivreA
    union all
    Select *,
           'Livre' as Situacao
      from #tmpLivreB
    union all
    Select *,
           'Ocupado' as Situacao
      from #tmpOcupado
     Order By HoraInicial,HoraFinal,Periodo
    
    /*Elimina as tabelas temporárias*/
    Drop Table #tmpDisponibilidade
    Drop Table #tmpOcupado
    Drop Table #tmpLivreA
    Drop Table #tmpLivreB
    

    Espero ter ajudado.

    Abraços.

    domingo, 4 de novembro de 2012 22:08