Table of contents
XML
TOC
Recolher sumário
Expandir sumário

Calcular o tempo decorrido

office 365 dev account|Última Atualização: 04/10/2017
|
1 Colaborador

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.

Armazenando dados de Data/Hora

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

Intevalos de valores de data válidos a partir de -647.434 (14 de janeiro, 100 D.C.) a 2.958.465 (31 de dezembro, 9.999 D.C.). Um valor de data de 0 representa 30 de dezembro de 1899. O Access armazena datas anteriores a 30 de desembro de1899 como números negativos.

Intervalo de valores de horas válido de .0 (00:00:00) a .99999 (23: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 por 24.

Double NumberDate PortionActual DateTime PortionActual Time
1.0131 de dezembro de 1899.012:00:00
2.521 de janeiro de 1900.512:00:00
27468.968752746815 de março de 1975.9687523:15:00
33914.125339146 de novembro de 1992

Calculando dados de horas

Como um valor de hora é armazenado como uma fração de um dia de 24 horas, você pode receber resultados com formatação incorreta, quando calcular intervalos de horários superiores a 24 horas. Para contornar esse comportamento, crie uma função definida pelo usuário para garantir que intervalos de horários sejam formatados corretamente.

O procedimento a seguir descreve como usar a função Format para formatar intervalos de hora. O procedimento aceita dois valores de hora e imprime os respectivos intervalos entre eles para a 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

Comparando dados de datas

Como as datas e horas são armazenadas em conjunto como números de precisão dupla, você pode receber resultados inesperados, quando comparar dados de Data/Hora. Por exemplo, se você digitar a seguinte expressão na janela Imediata, vai receber o resultado False (0), mesmo que a data atual seja 11/07/2006:

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

A função Now retorna um número de precisão dupla, representando a data e hora atuais. No entanto, A função DateValue retorna um número inteiro, representando a data, mas não um valor de hora 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 as funções, digite cada uma delas na janela Imediata, substitua a data atual para 11/07/2006 e pressione ENTER:

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

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

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

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

Comparando dados de horas

Ao comparar valores de horas, você pode receber resultados inconsistentes, uma vez que um valor de hora é armazenado como a parte fracionária de um número de ponto flutuante de precisão dupla. Por exemplo, se você digitar a seguinte expressão na janela imediata, vai receber o resultado False (0), mesmo que os dois valores de horas pareçam iguais:

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

Quando o Access converte um valor de hora em uma fração, o resultado calculado pode não ser o equivalente exato do valor da hora. A pequena diferença gerada pelo cálculo é suficiente para produzir um resultado False (0) ao comparar um valor armazenado a um valor constante.

Para receber resultados precisos quando comparar valores de horas, use um dos seguintes métodos. 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

Link fornecido por:

Ícone de Membro da Comunidade

a comunidade do UtterAccess

Sobre os colaboradores

UtterAccess é o fórum principal de wiki e a Ajuda do Microsoft Access. clique aqui para ingressar.

© 2017 Microsoft