Jump to content


Photo

Cálculo Data / Hora


  • Faça o login para participar
9 replies to this topic

#1 du_82

du_82

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Não informado

Posted 07/12/2004, 16:29

Bom dia,


Estou precisando fazer um sistema de cálculo de datas e horas (calculo de tempo de atendimento de um chamado), esse sistema vai funcionar da seguinte forma:
Expedientes...
Segunda-Feira - 08:00:00 / 17:30:00
Terça-Feira - 08:00:00 / 17:30:00
Quarta-Feira - 08:00:00 / 17:30:00
Quinta-Feira - 08:00:00 / 17:30:00
Sexta-Feira - 08:00:00 / 15:30:00

Vamos supor que abro um chamado na terça-feira às 14:30:00, esse chamado é encerrado na quinta-feira às 09:00:00. Preciso calcular o tempo que há entre essas duas datas/horas, mas há um porém que dificulta minha vida aqui... O cronometro deve rodar até atingir o final do expediente, por exemplo: Na terça contabilizo as horas das 14:30:00 até 17:30:00 e paro o cronometro, na quarta volto andar o cronometro à partir das 08:00:00 e paro novamente às 17:30:00 e assim por diante. Quero contabilizar apenas os horários que realmente são trabalhados...
Tem como desenvolver algo para resolver meu problema?
Detalhe: A data/hora inicial e a data/hora final à ser calculada já está armazenada e disponível.

Obrigado!

#2 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 07/12/2004, 21:40

Bom dia,


Estou precisando fazer um sistema de cálculo de datas e horas (calculo de tempo de atendimento de um chamado), esse sistema vai funcionar da seguinte forma:
Expedientes...
Segunda-Feira - 08:00:00 / 17:30:00
Terça-Feira - 08:00:00 / 17:30:00
Quarta-Feira - 08:00:00 / 17:30:00
Quinta-Feira - 08:00:00 / 17:30:00
Sexta-Feira - 08:00:00 / 15:30:00

Vamos supor que abro um chamado na terça-feira às 14:30:00, esse chamado é encerrado na quinta-feira às 09:00:00. Preciso calcular o tempo que há entre essas duas datas/horas, mas há um porém que dificulta minha vida aqui... O cronometro deve rodar até atingir o final do expediente, por exemplo: Na terça contabilizo as horas das 14:30:00 até 17:30:00 e paro o cronometro, na quarta volto andar o cronometro à partir das 08:00:00 e paro novamente às 17:30:00 e assim por diante. Quero contabilizar apenas os horários que realmente são trabalhados...
Tem como desenvolver algo para resolver meu problema?
Detalhe: A data/hora inicial e a data/hora final à ser calculada já está armazenada e disponível.

Obrigado!



Eu vo faze uma function.. mas soh há horas para esses dias da semana?

Edição feita por: hdz*, 07/12/2004, 21:48.

MCAD, MCP

#3 Agente Linhares

Agente Linhares

    fuis...abraços!

  • Ex-Admins
  • 3138 posts
  • Sexo:Não informado
  • Localidade:Biritiba Mirim-SP

Posted 08/12/2004, 01:43

vê se ajuda estes topicos:

http://forum.wmonlin...showtopic=84626
http://forum.wmonlin...showtopic=98815
> Busca On-line - A Busca que faltava na Internet! - Cadastre-se!
---------------------------------------------------------------------------
> BRdesign.NET - Soluções em Websites e Sistemas E-Commerce.
---------------------------------------------------------------------------
> BR-ecommerce - Sua loja virtual na internet! - Apenas R$99,90 mensais (hospedagem inclusa)!

#4 du_82

du_82

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Não informado

Posted 08/12/2004, 23:32

Bom dia,


Estou precisando fazer um sistema de cálculo de datas e horas (calculo de tempo de atendimento de um chamado), esse sistema vai funcionar da seguinte forma:
Expedientes...
Segunda-Feira - 08:00:00 / 17:30:00
Terça-Feira - 08:00:00 / 17:30:00
Quarta-Feira - 08:00:00 / 17:30:00
Quinta-Feira - 08:00:00 / 17:30:00
Sexta-Feira - 08:00:00 / 15:30:00

Vamos supor que abro um chamado na terça-feira às 14:30:00, esse chamado é encerrado na quinta-feira às 09:00:00. Preciso calcular o tempo que há entre essas duas datas/horas, mas há um porém que dificulta minha vida aqui... O cronometro deve rodar até atingir o final do expediente, por exemplo: Na terça contabilizo as horas das 14:30:00 até 17:30:00 e paro o cronometro, na quarta volto andar o cronometro à partir das 08:00:00 e paro novamente às 17:30:00 e assim por diante. Quero contabilizar apenas os horários que realmente são trabalhados...
Tem como desenvolver algo para resolver meu problema?
Detalhe: A data/hora inicial e a data/hora final à ser calculada já está armazenada e disponível.

Obrigado!



Eu vo faze uma function.. mas soh há horas para esses dias da semana?

Sim inicialmente somente esses períodos mencionados!!!
Posteriormente entrará o s´bado também, mas ai é questão de adaptação apenas...

Se puder me ajudar, agradeço e muito!

#5 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 09/12/2004, 19:49

Bom dia,


Estou precisando fazer um sistema de cálculo de datas e horas (calculo de tempo de atendimento de um chamado), esse sistema vai funcionar da seguinte forma:
Expedientes...
Segunda-Feira - 08:00:00 / 17:30:00
Terça-Feira - 08:00:00 / 17:30:00
Quarta-Feira - 08:00:00 / 17:30:00
Quinta-Feira - 08:00:00 / 17:30:00
Sexta-Feira - 08:00:00 / 15:30:00

Vamos supor que abro um chamado na terça-feira às 14:30:00, esse chamado é encerrado na quinta-feira às 09:00:00. Preciso calcular o tempo que há entre essas duas datas/horas, mas há um porém que dificulta minha vida aqui... O cronometro deve rodar até atingir o final do expediente, por exemplo: Na terça contabilizo as horas das 14:30:00 até 17:30:00 e paro o cronometro, na quarta volto andar o cronometro à partir das 08:00:00 e paro novamente às 17:30:00 e assim por diante. Quero contabilizar apenas os horários que realmente são trabalhados...
Tem como desenvolver algo para resolver meu problema?
Detalhe: A data/hora inicial e a data/hora final à ser calculada já está armazenada e disponível.

Obrigado!



Eu vo faze uma function.. mas soh há horas para esses dias da semana?

Sim inicialmente somente esses períodos mencionados!!!
Posteriormente entrará o s´bado também, mas ai é questão de adaptação apenas...

Se puder me ajudar, agradeço e muito!

Ta aí.. ve se é isso que vc ker.. na array vc ajusta a hora incial/final dos dias da semana. Se vc kiser usar o sabado como vc citou que poderia usar posteriormente trabalhe da seguinte forma... redimensione a array de (5,2) para (6,2) e retire os apostrofes das linhas:

arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado
Case 2, 3, 4, 5, 6, 7

------ Function --------
<%
  Function FormatDateTime(DateTime)
    If InStr(1, DateTime, "/") > 0 Then
      sDta = DateTime
      If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
      If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
      FormatDateTime = sDta
    Else
      sTime = DateTime
      If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
      If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
      If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
      FormatDateTime = sTime
    End If
  End Function

  Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
    Dim arrDias(5,2)

    arrDias(0,0) = "08:00:00": arrDias(0,1) = "17:30:00" 'Segunda
    arrDias(1,0) = "08:00:00": arrDias(1,1) = "17:30:00" 'Terça
    arrDias(2,0) = "08:00:00": arrDias(2,1) = "17:30:00" 'Quarta
    arrDias(3,0) = "08:00:00": arrDias(3,1) = "17:30:00" 'Quinta
    arrDias(4,0) = "08:00:00": arrDias(4,1) = "17:30:00" 'Sexta
   'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

    iD = Day(DataInicial)
    iM = Month(DataInicial)
    iA = Year(DataInicial)

    Do Until DataTmp = DataFinal
      DiaIni = iD
      MesIni = iM
      AnoIni = iA

      DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

      If IsDate(DataTmp) Then
        Select Case WeekDay(DataTmp)
          Case 2, 3, 4, 5, 6 ', 7
            sDias = sDias & DataTmp & "*"
        End Select
      End If

      iD = iD + 1
      If iD = 32 Then
        iM = iM + 1
        iD = 1
        If iM = 13 Then
          iA = iA + 1
          iM = 1
          iD = 1
        End If
      End If
    Loop

    If sDias <> "" Then
      If InStr(1, sDias, "*") > 0 Then
        sDias = Left(sDias, Len(sDias) - 1)
        If InStr(1, sDias, "*") > 0 Then
          Dias = Split(sDias, "*")

          For i = LBound(Dias) To UBound(Dias)
            If i = LBound(Dias) Then
              If HoraInicial > arrDias(WeekDay(Dias(i)) - 2, 0) Then
                HoraIniTmp = HoraInicial
              Else
                HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
              End If
            Else
              HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
            End If

            If i = UBound(Dias) Then
              If HoraFinal < arrDias(WeekDay(Dias(i)) - 2, 1)  Then
                HoraFimTmp = HoraFinal
              Else
                HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
              End If
            Else
              HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
            End If

            SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

          Next

        Else
          SecDif = DateDiff("s", HoraInicial, HoraFinal)
        End If

      End If
    Else
      CalculaHoras = -1
      Exit Function
    End If

    MinDif = SecDif \ 60
    SecDif = SecDif Mod 60
    HourDif = MinDif \ 60
    MinDif = MinDif Mod 60

    CalculaHoras = FormatDateTime(HourDif & ":" & MinDif & ":" & SecDif)

  End Function
%>

Para usar a função.. informe:
String = CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal) 

Respeitando o formato dd/mm/yyyy para data e hh:mm:ss para hora.

Eu num testei todas as condições possiveis entaum qq erro informa ai a linha q a gente da um jeito.
Bom teste ae.. ;)

Edição feita por: hdz*, 10/12/2004, 07:23.

MCAD, MCP

#6 du_82

du_82

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Não informado

Posted 10/12/2004, 11:10

Hdz,

Não sei o que está ocorrendo, mas o resultado não esta retornando corretamente na tela, veja logo no final do seu código, como eu inicializei as variáveis!
O resultado que esta retornando é:
367:30:00

<%
 Function FormatDateTime(DateTime)
   If InStr(1, DateTime, "/") > 0 Then
     sDta = DateTime
     If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
     If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
     FormatDateTime = sDta
   Else
     sTime = DateTime
     If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
     If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
     If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
     FormatDateTime = sTime
   End If
 End Function




 Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
   Dim arrDias(5,2)

   arrDias(0,0) = "08:00:00": arrDias(0,1) = "17:30:00" 'Segunda
   arrDias(1,0) = "08:00:00": arrDias(1,1) = "17:30:00" 'Terça
   arrDias(2,0) = "08:00:00": arrDias(2,1) = "17:30:00" 'Quarta
   arrDias(3,0) = "08:00:00": arrDias(3,1) = "17:30:00" 'Quinta
   arrDias(4,0) = "08:00:00": arrDias(4,1) = "15:30:00" 'Sexta
  'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

   iD = Day(DataInicial)
   iM = Month(DataInicial)
   iA = Year(DataInicial)

   Do Until DataTmp = DataFinal
     DiaIni = iD
     MesIni = iM
     AnoIni = iA

     DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

     If IsDate(DataTmp) Then
       Select Case WeekDay(DataTmp)
         Case 2, 3, 4, 5, 6 ', 7
           sDias = sDias & DataTmp & "*"
       End Select
     End If

     iD = iD + 1
     If iD = 32 Then
       iM = iM + 1
       iD = 1
       If iM = 13 Then
         iA = iA + 1
         iM = 1
         iD = 1
       End If
     End If
   Loop

   If sDias <> "" Then
     If InStr(1, sDias, "*") > 0 Then
       sDias = Left(sDias, Len(sDias) - 1)
       If InStr(1, sDias, "*") > 0 Then
         Dias = Split(sDias, "*")

         For i = LBound(Dias) To UBound(Dias)
           If i = LBound(Dias) Then
             If HoraInicial > arrDias(WeekDay(Dias(i)) - 2, 0) Then
               HoraIniTmp = HoraInicial
             Else
               HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
             End If
           Else
             HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
           End If

           If i = UBound(Dias) Then
             If HoraFinal < arrDias(WeekDay(Dias(i)) - 2, 1)  Then
               HoraFimTmp = HoraFinal
             Else
               HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
             End If
           Else
             HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
           End If

           SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

         Next

       Else
         SecDif = DateDiff("s", HoraInicial, HoraFinal)
       End If

     End If
   Else
     CalculaHoras = -1
     Exit Function
   End If

   MinDif = SecDif \ 60
   SecDif = SecDif Mod 60
   HourDif = MinDif \ 60
   MinDif = MinDif Mod 60

   If Len(SecDif) = 1 Then SecDif = "0" & SecDif
   If Len(MinDif) = 1 Then MinDif = "0" & MinDif
   If Len(HourDif) = 1 Then HourDif = "0" & HourDif

   CalculaHoras = HourDif & ":" & MinDif & ":" & SecDif



 End Function
%>

<%
dim string

DataInicial = "10/12/2004"
HoraInicial = "08:00:00"
DataFinal = "10/12/2004"
HoraFinal = "15:30:00"

String = CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal) 

response.write String

%>


#7 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 10/12/2004, 11:56

Hdz,

Não sei o que está ocorrendo, mas o resultado não esta retornando corretamente na tela, veja logo no final do seu código, como eu inicializei as variáveis!
O resultado que esta retornando é:
367:30:00

<%
 Function FormatDateTime(DateTime)
   If InStr(1, DateTime, "/") > 0 Then
     sDta = DateTime
     If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
     If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
     FormatDateTime = sDta
   Else
     sTime = DateTime
     If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
     If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
     If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
     FormatDateTime = sTime
   End If
 End Function




 Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
   Dim arrDias(5,2)

   arrDias(0,0) = "08:00:00": arrDias(0,1) = "17:30:00" 'Segunda
   arrDias(1,0) = "08:00:00": arrDias(1,1) = "17:30:00" 'Terça
   arrDias(2,0) = "08:00:00": arrDias(2,1) = "17:30:00" 'Quarta
   arrDias(3,0) = "08:00:00": arrDias(3,1) = "17:30:00" 'Quinta
   arrDias(4,0) = "08:00:00": arrDias(4,1) = "15:30:00" 'Sexta
  'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

   iD = Day(DataInicial)
   iM = Month(DataInicial)
   iA = Year(DataInicial)

   Do Until DataTmp = DataFinal
     DiaIni = iD
     MesIni = iM
     AnoIni = iA

     DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

     If IsDate(DataTmp) Then
       Select Case WeekDay(DataTmp)
         Case 2, 3, 4, 5, 6 ', 7
           sDias = sDias & DataTmp & "*"
       End Select
     End If

     iD = iD + 1
     If iD = 32 Then
       iM = iM + 1
       iD = 1
       If iM = 13 Then
         iA = iA + 1
         iM = 1
         iD = 1
       End If
     End If
   Loop

   If sDias <> "" Then
     If InStr(1, sDias, "*") > 0 Then
       sDias = Left(sDias, Len(sDias) - 1)
       If InStr(1, sDias, "*") > 0 Then
         Dias = Split(sDias, "*")

         For i = LBound(Dias) To UBound(Dias)
           If i = LBound(Dias) Then
             If HoraInicial > arrDias(WeekDay(Dias(i)) - 2, 0) Then
               HoraIniTmp = HoraInicial
             Else
               HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
             End If
           Else
             HoraIniTmp = arrDias(WeekDay(Dias(i)) - 2, 0)
           End If

           If i = UBound(Dias) Then
             If HoraFinal < arrDias(WeekDay(Dias(i)) - 2, 1)  Then
               HoraFimTmp = HoraFinal
             Else
               HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
             End If
           Else
             HoraFimTmp = arrDias(WeekDay(Dias(i)) - 2, 1)
           End If

           SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

         Next

       Else
         SecDif = DateDiff("s", HoraInicial, HoraFinal)
       End If

     End If
   Else
     CalculaHoras = -1
     Exit Function
   End If

   MinDif = SecDif \ 60
   SecDif = SecDif Mod 60
   HourDif = MinDif \ 60
   MinDif = MinDif Mod 60

   If Len(SecDif) = 1 Then SecDif = "0" & SecDif
   If Len(MinDif) = 1 Then MinDif = "0" & MinDif
   If Len(HourDif) = 1 Then HourDif = "0" & HourDif

   CalculaHoras = HourDif & ":" & MinDif & ":" & SecDif



 End Function
%>

<%
dim string

DataInicial = "10/12/2004"
HoraInicial = "08:00:00"
DataFinal = "10/12/2004"
HoraFinal = "15:30:00"

String = CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal) 

response.write String

%>

hmm vc tem certeza disso ? aqui está retornando 07:30:00.. testa ae..:
response.write CalculaHoras("10/12/2004", "08:00:00", "10/12/2004", "15:30:00")

Alias.. alguem ai pode testar fazendo favor e ver se tá retornando a diferença certa de horas plz.. thankz :)

Edição feita por: hdz*, 10/12/2004, 20:14.

MCAD, MCP

#8 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 11/12/2004, 00:36

Corrigido mais uma veiz (versão 0.00001b) cheio de bugs provavelmente hehehe:

Function FormatDateTime(DateTime)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  FormatDateTime()
  'Descrição: Formata hora e data para o formato [dd/mm/yyyy] e [hh:mm:ss]

  If InStr(1, DateTime, "/") > 0 Then
    sDta = DateTime
    If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
    If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
    FormatDateTime = sDta
  Else
    sTime = DateTime
    If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
    If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
    If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
    FormatDateTime = sTime
  End If
End Function

Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  CalculaHoras()
  'Descrição: Calcula as horas durante um período de datas

  Dim arrDias(5, 2)

  arrDias(0, 0) = "08:00:00": arrDias(0, 1) = "17:30:00" 'Segunda
  arrDias(1, 0) = "08:00:00": arrDias(1, 1) = "17:30:00" 'Terça
  arrDias(2, 0) = "08:00:00": arrDias(2, 1) = "17:30:00" 'Quarta
  arrDias(3, 0) = "08:00:00": arrDias(3, 1) = "17:30:00" 'Quinta
  arrDias(4, 0) = "08:00:00": arrDias(4, 1) = "15:30:00" 'Sexta
 'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

  iD = Day(DataInicial)
  iM = Month(DataInicial)
  iA = Year(DataInicial)

  Do Until DataTmp = DataFinal
    DiaIni = iD
    MesIni = iM
    AnoIni = iA

    DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

    If IsDate(DataTmp) Then
      Select Case Weekday(DataTmp)
        Case 2, 3, 4, 5, 6 ', 7
          sDias = sDias & DataTmp & "*"
      End Select
    End If

    iD = iD + 1
    If iD = 32 Then
      iM = iM + 1
      iD = 1
      If iM = 13 Then
        iA = iA + 1
        iM = 1
        iD = 1
      End If
    End If
  Loop

  If sDias <> "" Then
    If InStr(1, sDias, "*") > 0 Then
      sDias = Left(sDias, Len(sDias) - 1)
      If InStr(1, sDias, "*") > 0 Then
        Dias = Split(sDias, "*")

        For i = LBound(Dias) To UBound(Dias)
          If i = LBound(Dias) Then
            If HoraInicial > arrDias(Weekday(Dias(i)) - 2, 0) Then
              HoraIniTmp = HoraInicial
            Else
              HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
            End If
          Else
            HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
          End If

          If i = UBound(Dias) Then
            If HoraFinal < arrDias(Weekday(Dias(i)) - 2, 1) Then
              HoraFimTmp = HoraFinal
            Else
              HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
            End If
          Else
            HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
          End If

          SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

        Next

      Else
        If HoraInicial > arrDias(Weekday(sDias) - 2, 0) Then
          HoraIniTmp = HoraInicial
        Else
          HoraIniTmp = arrDias(Weekday(sDias) - 2, 0)
        End If
        If HoraFinal < arrDias(Weekday(sDias) - 2, 1) Then
          HoraFimTmp = HoraFinal
        Else
          HoraFimTmp = arrDias(Weekday(sDias) - 2, 1)
        End If

        SecDif = DateDiff("s", HoraIniTmp, HoraFimTmp)
      End If

    End If
  Else
    CalculaHoras = -1
    Exit Function
  End If

  MinDif = SecDif \ 60
  SecDif = SecDif Mod 60
  HourDif = MinDif \ 60
  MinDif = MinDif Mod 60

  CalculaHoras = FormatDateTime(HourDif & ":" & MinDif & ":" & SecDif)

End Function

Teste ae..tem q dar 16:30:

  Response.Write CalculaHoras("10/12/2004", "08:30:00", "13/12/2004", "21:00:45")

MCAD, MCP

#9 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 11/12/2004, 01:21

Também fiz uma função. Fica sendo como uma segunda opção...

Function CalculaHoras(Tempo1, Tempo2)
   Dim DiaH(5,1)
   Sabado = False ' True para contar os Sábados e False para não contar
   DiaH(0,0) = "08:00:00": DiaH(0,1) = "17:30:00" 'Segunda
   DiaH(1,0) = "08:00:00": DiaH(1,1) = "17:30:00" 'Terça
   DiaH(2,0) = "08:00:00": DiaH(2,1) = "17:30:00" 'Quarta
   DiaH(3,0) = "08:00:00": DiaH(3,1) = "17:30:00" 'Quinta
   DiaH(4,0) = "08:00:00": DiaH(4,1) = "15:30:00" 'Sexta
   If Sabado Then
      DiaH(5,0) = "08:00:00": DiaH(5,1) = "17:30:00" 'Sábado
   End If
   Data1 = DateValue(Tempo1)
   Data2 = DateValue(Tempo2)
   DifDias = DateDiff("d",Data1,Data2)
   Soma = 0
   For i = 0 To DifDias
      DataA = DateAdd("d",i,Data1)
      DiaS = WeekDay(DataA)
      If (DiaS = 7 And Not Sabado) Xor (DiaS <> 1) Then
         If DataA <> Data1 Then
            Hora1 = DiaH(DiaS-2,0)
         Else
            Hora1 = TimeValue(Tempo1)
            If DateDiff("n",Hora1,DiaH(DiaS-2,0)) > 0 Then Hora1 = DiaH(DiaS-2,0)
         End If
         If DataA <> Data2 Then
            Hora2 = DiaH(DiaS-2,1)
         Else
            Hora2 = TimeValue(Tempo2)
            If DateDiff("n",Hora2,DiaH(DiaS-2,1)) < 0 Then Hora2 = DiaH(DiaS-2,1)
         End If
         Soma = Soma + DateDiff("n",Hora1,Hora2)
      End If
   Next
   Hora = Soma \ 60
   Minuto = Soma Mod 60
   If Len(Hora) < 2 Then Hora = "0" & Hora
   If Len(Minuto) < 2 Then Minuto = "0" & Minuto
   CalculaHoras = Hora & ":" & Minuto
End Function
Deve ser chamada assim:

Response.Write CalculaHoras("10/12/2004 08:30", "13/12/2004 21:00")
Ela só não chega a considerar os segundos, mas acho que não precisa tanto também...

#10 du_82

du_82

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Não informado

Posted 13/12/2004, 07:20

Corrigido mais uma veiz (versão 0.00001b) cheio de bugs provavelmente hehehe:

Function FormatDateTime(DateTime)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  FormatDateTime()
  'Descrição: Formata hora e data para o formato [dd/mm/yyyy] e [hh:mm:ss]

  If InStr(1, DateTime, "/") > 0 Then
    sDta = DateTime
    If Mid(sDta, 2, 1) = "/" Then sDta = "0" & sDta
    If Mid(sDta, 5, 1) = "/" Then sDta = Left(sDta, 3) & "0" & Right(sDta, 6)
    FormatDateTime = sDta
  Else
    sTime = DateTime
    If Mid(sTime, 2, 1) = ":" Then sTime = "0" & sTime
    If Mid(sTime, 5, 1) = ":" Then sTime = Left(sTime, 3) & "0" & Right(sTime, Len(sTime) - 3)
    If Mid(sTime, Len(sTime) - 1, 1) = ":" Then sTime = Left(sTime, Len(sTime) - 1) & "0" & Right(sTime, 1)
    FormatDateTime = sTime
  End If
End Function

Function CalculaHoras(DataInicial, HoraInicial, DataFinal, HoraFinal)
  'Autor:     Felipe C. Mosca <fmosca@ajato.com.br>
  'Function:  CalculaHoras()
  'Descrição: Calcula as horas durante um período de datas

  Dim arrDias(5, 2)

  arrDias(0, 0) = "08:00:00": arrDias(0, 1) = "17:30:00" 'Segunda
  arrDias(1, 0) = "08:00:00": arrDias(1, 1) = "17:30:00" 'Terça
  arrDias(2, 0) = "08:00:00": arrDias(2, 1) = "17:30:00" 'Quarta
  arrDias(3, 0) = "08:00:00": arrDias(3, 1) = "17:30:00" 'Quinta
  arrDias(4, 0) = "08:00:00": arrDias(4, 1) = "15:30:00" 'Sexta
 'arrDias(5,0) = "08:00:00": arrDias(5,1) = "17:30:00" 'Sabado

  iD = Day(DataInicial)
  iM = Month(DataInicial)
  iA = Year(DataInicial)

  Do Until DataTmp = DataFinal
    DiaIni = iD
    MesIni = iM
    AnoIni = iA

    DataTmp = FormatDateTime(DiaIni & "/" & MesIni & "/" & AnoIni)

    If IsDate(DataTmp) Then
      Select Case Weekday(DataTmp)
        Case 2, 3, 4, 5, 6 ', 7
          sDias = sDias & DataTmp & "*"
      End Select
    End If

    iD = iD + 1
    If iD = 32 Then
      iM = iM + 1
      iD = 1
      If iM = 13 Then
        iA = iA + 1
        iM = 1
        iD = 1
      End If
    End If
  Loop

  If sDias <> "" Then
    If InStr(1, sDias, "*") > 0 Then
      sDias = Left(sDias, Len(sDias) - 1)
      If InStr(1, sDias, "*") > 0 Then
        Dias = Split(sDias, "*")

        For i = LBound(Dias) To UBound(Dias)
          If i = LBound(Dias) Then
            If HoraInicial > arrDias(Weekday(Dias(i)) - 2, 0) Then
              HoraIniTmp = HoraInicial
            Else
              HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
            End If
          Else
            HoraIniTmp = arrDias(Weekday(Dias(i)) - 2, 0)
          End If

          If i = UBound(Dias) Then
            If HoraFinal < arrDias(Weekday(Dias(i)) - 2, 1) Then
              HoraFimTmp = HoraFinal
            Else
              HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
            End If
          Else
            HoraFimTmp = arrDias(Weekday(Dias(i)) - 2, 1)
          End If

          SecDif = SecDif + DateDiff("s", HoraIniTmp, HoraFimTmp)

        Next

      Else
        If HoraInicial > arrDias(Weekday(sDias) - 2, 0) Then
          HoraIniTmp = HoraInicial
        Else
          HoraIniTmp = arrDias(Weekday(sDias) - 2, 0)
        End If
        If HoraFinal < arrDias(Weekday(sDias) - 2, 1) Then
          HoraFimTmp = HoraFinal
        Else
          HoraFimTmp = arrDias(Weekday(sDias) - 2, 1)
        End If

        SecDif = DateDiff("s", HoraIniTmp, HoraFimTmp)
      End If

    End If
  Else
    CalculaHoras = -1
    Exit Function
  End If

  MinDif = SecDif \ 60
  SecDif = SecDif Mod 60
  HourDif = MinDif \ 60
  MinDif = MinDif Mod 60

  CalculaHoras = FormatDateTime(HourDif & ":" & MinDif & ":" & SecDif)

End Function

Teste ae..tem q dar 16:30:

  Response.Write CalculaHoras("10/12/2004", "08:30:00", "13/12/2004", "21:00:45")

Bom dia HDZ,

Chego a acreditar que é alguma distorção do meu servidor web aqui, pois novamente com o seu código (CTRL + C / CTRL + V) me retornou um horario não desejado = 390:0:00. Muito estranho.

Agora o que comprova que o problema é aqui, é que o resultado da função que o Leo fez também retorna um horario distorcido = 409:00.

Ambos resultados de acordo com os horarios que vocês escolheram ai no seus posts.

De qualquer forma valeu, ja ajudou e muito! (como aprendizado)
Vou ver com o pessoal de infra-estrutura WEB aqui para saber quais possíveis motivos...

Valeu!
Abraços,




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq