Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Retornar os intervalos de um dia


isaikki

Question

Boa tarde pessoal

To com um problema em uma consulta, vou explicar o problema:

Eu tenho uma tabela que grava a alocação de pessoas, mas as pessoas tem que parar a alocação quando saem para almoçar ou lanchar, etc... eu queria uma consulta que retornasse esses intervalos, com a hora de início do intervalo e a hora que entrou em outra alocação... complicado...

Eu ia fazer com loop, mas como não manjo muito bem de loop...

Tentei fazendo o DATEDIFF da hora de saída do dia menos o DATEDIFF da hora de entrada do dia, para retornar o tempo total do dia, e a mesma coisa para somar a hora alocada durante esse dia, daí peguei o total e diminuí pela hora alocada, e retornou exatamente os minutos parados durante o dia... o único problema é que eu preciso que me retorne também a hora de início e a hora final do intervalo

A tabela tem esses campos: (codigoAlocacao, data, inicioAlocacao, terminoAlocacao, codigoPessoa)

Desde já agradeço a ajuda

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Boa tarde isaikki,

Utilize o Datediff entre os horários de terminoAlocacao e inicioAlocacao. Mas ao invés de pegar na mesma linha, você pegará o término da alocação da 1ª linha e fará a diferença do início da alocação da 2ª linha. Para isto, as linhas devem estar ordenadas pelo início da alocação.

Ex.:

inicioAlocacao | terminoAlocacao

08:00 | 09:00

09:30 | 10:40

Faça a diferença entre 09:00 e 09:30 hs.

Link to comment
Share on other sites

  • 0

Boa tarde isaikki,

Fiz uma implementação simples com 3 linhas, apenas para exemplificar. Caso seja isto, faça as adaptações necessárias....

-- criação de tabela temporária
create table #Tabela (codigoAlocacao int, inicioAlocacao DATETIME, terminoAlocacao DATETIME)

-- inserção dos dados
INSERT INTO #tabela VALUES (5, '2011-12-02 08:00', '2011-12-02 09:00')
INSERT INTO #tabela VALUES (8, '2011-12-02 10:50', '2011-12-02 11:00')
INSERT INTO #tabela VALUES (7, '2011-12-02 09:30', '2011-12-02 10:40')

---rode daqui até o fim
DECLARE @Codigo AS INT
DECLARE @Inicio AS DATETIME
DECLARE @Termino AS DATETIME

SET @Codigo=0

SET @Codigo = (SELECT top 1 codigoAlocacao FROM #Tabela where codigoAlocacao>@Codigo ORDER BY codigoAlocacao)
SET @Termino = (SELECT top 1 terminoAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)

WHILE 0=0
BEGIN
SET @Codigo = (SELECT top 1 codigoAlocacao FROM #Tabela where codigoAlocacao>@Codigo ORDER BY codigoAlocacao)
SET @Inicio = (SELECT top 1 inicioAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)    

print DATEDIFF (mi, @Termino, @Inicio)

SET @Termino = (SELECT top 1 terminoAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)
IF (ISDATE(@Inicio)=0) break
END

Link to comment
Share on other sites

  • 0

Cara, show de bola!!!

Entendi aqui o uso do WHILE, pelo que eu vi dá pra adaptar para o que eu quero!

Agora, só mais uma pergunta: como eu faço pra, na mesma linha que ele retorna o intervalo, colocar a hora, por exemplo, como outra coluna? Tentei colocar outro print, mas ele mostra na linha de baixo

Muito obrigado mesmo!

Edited by isaikki
Link to comment
Share on other sites

  • 0

Concatena as informações no mesmo print... mas ai você terá q converter pra caracter, porque senão o sql vai tentar somar os valores e dará erro de tipo. No exempo coloquei a hora inicial:

---rode daqui até o fim
DECLARE @Codigo AS INT
DECLARE @Inicio AS DATETIME
DECLARE @Termino AS DATETIME

SET @Codigo=0

SET @Codigo = (SELECT top 1 codigoAlocacao FROM #Tabela where codigoAlocacao>@Codigo ORDER BY codigoAlocacao)
SET @Termino = (SELECT top 1 terminoAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)

WHILE 0=0
BEGIN
SET @Codigo = (SELECT top 1 codigoAlocacao FROM #Tabela where codigoAlocacao>@Codigo ORDER BY codigoAlocacao)
SET @Inicio = (SELECT top 1 inicioAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)    

print cast (DATEDIFF (mi, @Termino, @Inicio) AS VARCHAR) + ' Horas:' + convert(varchar, @Inicio, 108)

SET @Termino = (SELECT top 1 terminoAlocacao FROM #Tabela WHERE codigoAlocacao=@Codigo)
IF (ISDATE(@Inicio)=0) break
END

Qualquer dúvida, pode postar!! :.)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...