Usuário com melhor resposta
diferença entre datas

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.
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.brSe 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
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
-
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.brSe 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
-
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 ?
-
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
-
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.