Compartilhar via


Calcular o tempo decorrido

Este tópico explica como o Access armazena o tipo de dados Data/Hora e por que você pode receber resultados inesperados quando calcular ou comparar datas e horas.

Armazenar Tipo de dados Data/Hora

Access armazenará o tipo de dados data/hora como um número de dupla precisão, de ponto flutuante (casas decimais até 15). A parte inteira de número de dupla precisão representa a data; parte decimal representa a hora.

Data válida valores variam de-647,434 (1 de janeiro de 100 D.C.) para 2,958,465 (31 de dezembro, 9999, D.C.). Um valor de data 0 representa 30 de dezembro de 1899. Access armazena as datas antes de 30 de dezembro de 1899 como números negativos.

Os valores válidos vão de .0 a (00:00:00) para .99999 (11:59:59). O valor numérico representa a fração de um dia. Você pode converter o valor numérico em horas, minutos e segundos multiplicando o valor numérico por 24.

Número duplo Date portion Data real Parte da hora Hora real
1.0 1 31 de dezembro de 1899 .0 12:00:00
2.5 2 1 de janeiro de 1900 .5 12:00:00
27468.96875 27468 15 de março de 1975 .96875 23:15:00
33914.125 33914 6 de novembro de 1992

Calcular dados da hora

Como um valor de hora é armazenado como uma fração de 24 horas por dia, você pode receber formatação incorretas quando você calcular intervalos de tempo maiores do que 24 horas. Solução alternativa para esse comportamento, você pode criar uma função definida pelo usuário, para garantir que o intervalos de tempo estão formatados corretamente.

O procedimento a seguir mostra como usar a função formato para formatar intervalos de tempo. O procedimento aceita dois valores de tempo e imprime o intervalo entre eles na janela imediata em vários formatos diferentes.

Function ElapsedTime(endTime As Date, startTime As Date) 
    Dim strOutput As String 
    Dim Interval As Date 
     
    ' Calculate the time interval. 
    Interval = endTime - startTime 
  
    ' Format and print the time interval in seconds. 
    strOutput = Int(CSng(Interval * 24 * 3600)) & " Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in minutes and seconds. 
    strOutput = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _ 
        & " Minutes:Seconds" 
    Debug.Print strOutput 
     
    ' Format and print the time interval in hours, minutes and seconds. 
    strOutput = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _ 
           & " Hours:Minutes:Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in days, hours, minutes and seconds. 
    strOutput = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _ 
        & " Hours " & Format(Interval, "nn") & " Minutes " & _ 
        Format(Interval, "ss") & " Seconds" 
    Debug.Print strOutput 
 
End Function

Comparar dados de data

Como datas e horas são armazenadas juntos como números de dupla precisão, você pode receber resultados inesperados ao comparar dados data/hora. Por exemplo, se a janela imediata digitar a expressão a seguir, você recebe um falso resultado (0) até mesmo se a data de hoje é 11/7/2006:

? Now()=DateValue("7/11/2006")

A função agora retornará um número de dupla precisão representando a data e hora atuais. No entanto, a função Datavalor retorna um de número inteiro que representa a data, mas não é um valor de tempo fracionário. Como resultado, Now é igual a DateValue somente quando Now retorna uma hora de 00:00:00 (12:00:00).

Para receber resultados precisos quando comparar valores de datas, use uma das funções a seguir. Para testar cada função, digite-a janela imediata, substitua a data atual de 11/7/2006 e pressione ENTER:

Para retornar um valor de número inteiro, use a função Data:

?Date()=DateValue("7/11/2006")

Para remover a parte fracionária da função Agora, use a função Int:

?Int(Now())=DateValue("7/11/2006")

Comparar os dados de tempo

Quando você comparar valores de tempo, você pode receber inconsistentes resultados como um valor de hora é armazenado como parte fracionária um número de ponto flutuante de dupla precisão. Por exemplo, se a janela imediata digitar a expressão a seguir, você recebe um falso resultado (0) até mesmo se os dois valores de tempo pareçam o mesmo:

var1 = #2:01:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #2:11:00 PM# 

Quando o Access converte um valor de tempo em uma fração, o resultado calculado pode não ser equivalente exato do valor de tempo. A diferença pequena causada pelo cálculo é suficiente para produzir um falso resultado (0), quando você comparar um valor armazenado em um valor constante.

Para receber resultados precisos, quando você comparar valores de data, use uma das funções a seguir. Para testar os métodos, digite-os na janela Imediata e pressione ENTER:

Adicione uma data associada à comparação de horas:

var1 = #7/11/2006 2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #7/11/2006 2:10:00 PM#

Converta os valores de horas em tipos de dados String, antes de compará-los:

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? CStr(var2) = CStr(#2:10:00 PM#)

Use a função DateDiff para comparar unidades precisas como segundos:

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? DateDiff("s", var2, #2:10:00 PM#) = 0

Sobre os colaboradores

Ligação fornecida peloÍcone de Membro da Comunidade da comunidade UtterAccess .

UtterAccess é o fórum principal de wiki e de ajuda do Microsoft Access.

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.