none
Somar hora varchar RRS feed

  • Pergunta

  • Tenho os seguintes campos como varchar:

    0800    1215    1406    1801

    e preciso somar todos pra ter o horário trabalhado no dia se possível no formato de exemplo 8:48

    Alguma idéia?

    sexta-feira, 3 de janeiro de 2014 18:09

Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select
        CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME) as HoraEnt,
        CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME) as HoraInt,
        CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME) as HoraRet,
        CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME) as HoraSai,
        CAST
            (DATEADD
                 (SECOND,
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME),
                      CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME)) +
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME),
                      CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME)),
                  0) as TIME) as HorasTrab
    from Tabela

    Espero que ajude.


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

    sexta-feira, 3 de janeiro de 2014 18:43
  • Olá

    vc precisa converter para segundos e somar os segundos.

    Segue abaixo a formula para converter para segundos. A coluna abaixo é do banco adventoreworks. Mas pode ser qualquer coluna tipo date com hora minuto e segundo.

    Select MeuModifiedDate  = ISNULL((DATEPART(HOUR, CONVERT(DATETIME, ModifiedDate)) * 3600) + 
                                   (DATEPART(MINUTE, CONVERT(DATETIME, ModifiedDate)) * 60) + DATEPART(SECOND, CONVERT(DATETIME, ModifiedDate)), 0) 
                            FROM Purchasing.Vendor

    Para voce converter de segundos para Hora-min-seg voce faz o abaixo exemplificado.

    declare @hours int, @minutes int, @seconds int, @result nvarchar(20), @TotalSeconds INT
    SET @TotalSeconds = 44397

    set @hours = @TotalSeconds / 3600
    set @minutes = (@TotalSeconds % 3600) / 60
    set @seconds = @TotalSeconds % 60

    set @result =  CONVERT(nvarchar(20),@hours) + ':' + CONVERT(nvarchar(20),@minutes) + ':' +CONVERT(nvarchar(20),@seconds)
    SELECT @result        

    Não sei bem o que você deseja, porem, quando eu precisei, eu utilizei uma tabela temporária, gravei meus dados sumarizados e na saída final do select eu converti de novo para hora-min-seg

    espero que te ajude.

    sexta-feira, 3 de janeiro de 2014 18:58
  • Voce precisa converter cada varchar em date e depois realizar a soma..

    como eu creio que seu campo possua uma formataçao homogenea, voce pode fazer o seguinte:

    DECLARE @tempos varchar(4);
    DECLARE @tempot datetime;
    set @tempos='0800';
    set @tempot =Convert(datetime,concat(substring(@tempos,1,2),':',substring(@tempos,3,2)));
    select @tempot ;
    


    Para o calculo, siga a dica deste topico:

    http://social.msdn.microsoft.com/Forums/en-US/cac9c12f-e512-4ec5-aaca-f80fd353ab0b/calculo-de-tempo-trabalhado



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 3 de janeiro de 2014 18:43
  • Diego, 

         Eu entendo sua situação. Se o seu software for de terceiros, acho que não há muito o que fazer, além de criar "jeitinhos" para poder ter as suas respostas... Mas isso é gambi e o pior sobra pro banco...

         Se a aplicação é interna, bota bronca no desenvolvimento para eles arrumarem isso!! Eles podem converter para hora antes de importar pro banco... 

         Espero ter ajudado!


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Marcado como Resposta Giovani Cr sexta-feira, 10 de janeiro de 2014 14:11
    segunda-feira, 6 de janeiro de 2014 13:50
    Moderador
  • Diego,

    Acho que se uma das colunas estiver em branco vai complicar... acho que não será possível fazer o calculo das horas, vai depender de como deverá ficar o resultado nesses casos.


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

    • Marcado como Resposta Giovani Cr sexta-feira, 10 de janeiro de 2014 14:11
    segunda-feira, 6 de janeiro de 2014 17:34

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select
        CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME) as HoraEnt,
        CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME) as HoraInt,
        CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME) as HoraRet,
        CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME) as HoraSai,
        CAST
            (DATEADD
                 (SECOND,
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME),
                      CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME)) +
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME),
                      CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME)),
                  0) as TIME) as HorasTrab
    from Tabela

    Espero que ajude.


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

    sexta-feira, 3 de janeiro de 2014 18:43
  • Voce precisa converter cada varchar em date e depois realizar a soma..

    como eu creio que seu campo possua uma formataçao homogenea, voce pode fazer o seguinte:

    DECLARE @tempos varchar(4);
    DECLARE @tempot datetime;
    set @tempos='0800';
    set @tempot =Convert(datetime,concat(substring(@tempos,1,2),':',substring(@tempos,3,2)));
    select @tempot ;
    


    Para o calculo, siga a dica deste topico:

    http://social.msdn.microsoft.com/Forums/en-US/cac9c12f-e512-4ec5-aaca-f80fd353ab0b/calculo-de-tempo-trabalhado



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 3 de janeiro de 2014 18:43
  • Olá

    vc precisa converter para segundos e somar os segundos.

    Segue abaixo a formula para converter para segundos. A coluna abaixo é do banco adventoreworks. Mas pode ser qualquer coluna tipo date com hora minuto e segundo.

    Select MeuModifiedDate  = ISNULL((DATEPART(HOUR, CONVERT(DATETIME, ModifiedDate)) * 3600) + 
                                   (DATEPART(MINUTE, CONVERT(DATETIME, ModifiedDate)) * 60) + DATEPART(SECOND, CONVERT(DATETIME, ModifiedDate)), 0) 
                            FROM Purchasing.Vendor

    Para voce converter de segundos para Hora-min-seg voce faz o abaixo exemplificado.

    declare @hours int, @minutes int, @seconds int, @result nvarchar(20), @TotalSeconds INT
    SET @TotalSeconds = 44397

    set @hours = @TotalSeconds / 3600
    set @minutes = (@TotalSeconds % 3600) / 60
    set @seconds = @TotalSeconds % 60

    set @result =  CONVERT(nvarchar(20),@hours) + ':' + CONVERT(nvarchar(20),@minutes) + ':' +CONVERT(nvarchar(20),@seconds)
    SELECT @result        

    Não sei bem o que você deseja, porem, quando eu precisei, eu utilizei uma tabela temporária, gravei meus dados sumarizados e na saída final do select eu converti de novo para hora-min-seg

    espero que te ajude.

    sexta-feira, 3 de janeiro de 2014 18:58
  • Diego,

          Minha primeira dica seria você mudar de VARCHAR para TIME (se for SQL 2008) o seu tipo de dado.

          Feito isso, basta somar e subtrair como você desejar...

          Lembre-se de verificar conceitos de bancos de dados... Constraints servem para determinar qual o tipo de dado que o campo terá, use o tipo de dado correto para o dado que ele vai conter... Varchar está totalmente errado neste caso...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    sexta-feira, 3 de janeiro de 2014 19:23
    Moderador
  • Diego,

          Minha primeira dica seria você mudar de VARCHAR para TIME (se for SQL 2008) o seu tipo de dado.

          Feito isso, basta somar e subtrair como você desejar...

          Lembre-se de verificar conceitos de bancos de dados... Constraints servem para determinar qual o tipo de dado que o campo terá, use o tipo de dado correto para o dado que ele vai conter... Varchar está totalmente errado neste caso...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    Roberto,

    Concordo plenamente com a sua orientação e sugestão.

    Mas como respostas, marquei os outros posts, pois estão próximos a necessidade do Diego.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 4 de janeiro de 2014 15:20
  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select
        CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME) as HoraEnt,
        CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME) as HoraInt,
        CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME) as HoraRet,
        CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME) as HoraSai,
        CAST
            (DATEADD
                 (SECOND,
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraEnt, 2) + ':' + RIGHT(HoraEnt, 2) as TIME),
                      CAST(LEFT(HoraInt, 2) + ':' + RIGHT(HoraInt, 2) as TIME)) +
                  DATEDIFF
                     (SECOND, 
                      CAST(LEFT(HoraRet, 2) + ':' + RIGHT(HoraRet, 2) as TIME),
                      CAST(LEFT(HoraSai, 2) + ':' + RIGHT(HoraSai, 2) as TIME)),
                  0) as TIME) as HorasTrab
    from Tabela

    Espero que ajude.


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

    Bom dia!!

    Eu até cheguei no seu select por aqui porém estou me perdendo na conversão olha o erro:

    Conversion failed when converting date and/or time from character string.

    segunda-feira, 6 de janeiro de 2014 10:56
  • Diego,

          Minha primeira dica seria você mudar de VARCHAR para TIME (se for SQL 2008) o seu tipo de dado.

          Feito isso, basta somar e subtrair como você desejar...

          Lembre-se de verificar conceitos de bancos de dados... Constraints servem para determinar qual o tipo de dado que o campo terá, use o tipo de dado correto para o dado que ele vai conter... Varchar está totalmente errado neste caso...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    Roberto,

    Concordo plenamente com a sua orientação e sugestão.

    Mas como respostas, marquei os outros posts, pois estão próximos a necessidade do Diego.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    O problema é que este banco eu não posso alterar e o sistema usa varchar por conta da importação das marcações do relógio de ponto que vem como texto...
    segunda-feira, 6 de janeiro de 2014 10:57
  • Bom dia,

    Esse pode estar ocorrendo porque existe alguma(s) linha(s) onde as colunas estão nulas, em branco ou com valores inválidos para converter para Time (ex: '1365').

    Espero que ajude.


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

    segunda-feira, 6 de janeiro de 2014 12:45
  • Bom dia,

    Esse pode estar ocorrendo porque existe alguma(s) linha(s) onde as colunas estão nulas, em branco ou com valores inválidos para converter para Time (ex: '1365').

    Espero que ajude.


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

    Realmente há colunas em branco que é quando o infeliz não bate ponto e o horário é tipo BR, ou seja, tem 1301, 1800...

    Como faria para estes casos?

    segunda-feira, 6 de janeiro de 2014 13:27
  • Diego, 

         Eu entendo sua situação. Se o seu software for de terceiros, acho que não há muito o que fazer, além de criar "jeitinhos" para poder ter as suas respostas... Mas isso é gambi e o pior sobra pro banco...

         Se a aplicação é interna, bota bronca no desenvolvimento para eles arrumarem isso!! Eles podem converter para hora antes de importar pro banco... 

         Espero ter ajudado!


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Marcado como Resposta Giovani Cr sexta-feira, 10 de janeiro de 2014 14:11
    segunda-feira, 6 de janeiro de 2014 13:50
    Moderador
  • Diego,

    Acho que se uma das colunas estiver em branco vai complicar... acho que não será possível fazer o calculo das horas, vai depender de como deverá ficar o resultado nesses casos.


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

    • Marcado como Resposta Giovani Cr sexta-feira, 10 de janeiro de 2014 14:11
    segunda-feira, 6 de janeiro de 2014 17:34