Como armazenar, calcular e comparar dados de Data/Hora no Microsoft Access

Resumo

Este artigo descreve como o Microsoft Access armazena o tipo de dados Data/Hora. Este artigo também descreve por que motivo pode receber resultados inesperados quando calcula datas e horas ou compara datas e horas.

Este artigo descreve os seguintes tópicos:

  • Armazenar dados de Data/Hora
  • Formatar um campo Data/Hora
  • Calcular dados de tempo
  • Comparar dados de data
  • Comparar dados de tempo

Mais Informações

Armazenar dados de Data/Hora

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

Os valores de data válidos variam entre -657.434 (1 de janeiro de 100 d.C.) e 2.958.465 (31 de dezembro de 9999 d.C.). Um valor de data de 0 representa 30 de dezembro de 1899. O Access armazena datas anteriores a 30 de dezembro de 1899 como números negativos.

Os valores de tempo válidos variam entre 0,0 (00:00:00) e 0,99999 (23:59:59). O valor numérico representa uma fração de um dia. Pode converter o valor numérico em horas, em minutos e em segundos ao multiplicar o valor numérico por 24.

A tabela seguinte mostra como o Access armazena valores de Data/Hora:

Número duplo Parte da data Data real Parte do tempo Hora real
1.0 1 31 de dezembro de 1899 .0 00:00 da manhã.
2.5 2 1 de janeiro de 1900 .5 Às 12:00.
27468.96875 27468 15 de março de 1975 .96875 23h15.
36836.125 36836 6 de novembro de 2000 .125 3:00:00 da manhã.

Para ver como o Access armazena valores de Data/Hora como números, escreva os seguintes comandos na janela Imediato, prima ENTER e, em seguida, repare nos resultados:

? CDbl(#18/5/1999 14:00:00#)

Resultado igual a: 36298.5833333333

? CDbl(#14/12/1849 17:32:00#)

Resultado igual a: -18278.73055555556

Para ver a data e a hora dos valores numéricos, escreva os seguintes comandos na janela Imediato, prima ENTER e, em seguida, repare nos resultados:

? CVDate(1.375)

Resultado igual a: 31/12/1899 9:00:00

? CVDate(-304398.575)

Resultado igual a: 1/08/1066 13:48:00

Formatar um campo Data/Hora

Pode formatar um valor de Data/Hora para apresentar uma data, uma hora ou ambos. Quando utiliza um formato apenas de data, o Access armazena um valor de 0 para a parte da hora. Quando utiliza um formato apenas de tempo, o Access armazena um valor de 0 para a parte da data.

A tabela seguinte mostra como o Access armazena valores de Data/Hora. A tabela seguinte também mostra como pode apresentar esses valores através de diferentes formatos:

Valor armazenado (número duplo) Formato predefinido (Data Geral) Formato personalizado (mm/dd/aaaa hh:nn:ss A.M./P.M.)
36295.0 5/15/99 15/05/1999 12:00:00
0.546527777777778 13:07 30/12/1899 13:07:00
36232.9375 3/13/99 22:30 13/13/1999 22:30:00

Nota O formato predefinido para um valor de Data/Hora é Data Geral. Se um valor for apenas de data, não é apresentada nenhuma hora. Se o valor for apenas tempo, não é apresentada nenhuma data.

Calcular dados de tempo

Uma vez que um valor de tempo é armazenado como uma fração de um dia de 24 horas, poderá receber resultados de formatação incorretos quando calcular intervalos de tempo superiores a 24 horas. Para contornar este comportamento, pode criar uma função definida pelo utilizador para garantir que os intervalos de tempo estão formatados corretamente.

A Microsoft fornece exemplos de programação apenas a título informativo, sem qualquer garantia expressa ou implícita, incluindo, sem limitações, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador está familiarizado com a linguagem de programação demonstrada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às suas necessidades específicas. Para calcular e formatar corretamente intervalos de tempo, siga estes passos:

  1. Crie um módulo e, em seguida, escreva a seguinte linha na secção Declarações se a seguinte linha ainda não existir:

    Opção Explícita

  2. Escreva o seguinte procedimento:

    '------------------------------------------------------------------
    '  This function calculates the elapsed time between two values and then
    '  formats the result in four different ways.
    '
    '  The function accepts interval arguments such as the following:
    '
    '     #5/12/95 6:00:00AM# - #5/11/95 10:00:00PM#
    '
    '
    '
    '     [End Time]-[Start Time]
    '------------------------------------------------------------------
    
    Function ElapsedTime (Interval)
      Dim x
      x = Int(CSng(Interval * 24 * 3600)) & " Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _
         & " Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _
         & " Hours:Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _
         & " Hours " & Format(Interval, "nn") & " Minutes " & _
         Format(Interval, "ss") & " Seconds"
      Debug.Print x
    
    End Function
    
  3. Escreva a seguinte linha na janela Imediato e, em seguida, prima ENTER:

    ? ElapsedTime(#6/1/1999 8:23:00PM#-#1/6/1999 8:12:12AM#)

Repare que são apresentados os seguintes valores:

43848 Seconds
730:48 Minutes:Seconds
12:10:48 Hours:Minutes:Seconds
0 days 12 Hours 10 Minutes 48 Seconds

Comparar dados de data

Uma vez que as datas e horas são armazenadas em conjunto como números de precisão dupla, poderá receber resultados inesperados ao comparar dados de Data/Hora. Por exemplo, se escrever a seguinte expressão na janela Imediato, receberá um resultado Falso mesmo que a data atual seja 31/03/1999:

? Now()=DateValue("31/3/1999")

A função Now() devolve um número de precisão dupla que representa a data atual e a hora atual. No entanto, a função DateValue() devolve um número inteiro que representa a data, mas não um valor de tempo fracionário. Portanto, Now() é igual a DateValue() apenas quando Now() devolve uma hora de 00:00:00 (12:00:00).

Para receber resultados precisos ao comparar valores de data, utilize uma das seguintes funções. Para testar cada função, escreva a função na janela Imediato, substitua a data atual por 31/31/1999 e, em seguida, prima ENTER:

  • Para devolver um valor inteiro, utilize a função Date():

    ? Date()=DateValue("31/3/1999")

  • Para remover a parte fracionária da função Now(), utilize a função Int():

    ? Int(Now())=DateValue("31/3/1999")

Comparar dados de tempo

Quando compara valores de tempo, pode receber resultados inconsistentes porque um valor de tempo é armazenado como a parte fracionária de um número de vírgula flutuante de precisão dupla. Por exemplo, se escrever a seguinte expressão na janela Imediato, receberá um resultado falso (0), mesmo que os dois valores de tempo tenham o mesmo aspeto:

var1 = #14:01:00#

var2 = DateAdd("n", 10, var1)

? var2 = #14:11:00#

Quando o Access converte um valor de tempo numa fração, o resultado calculado pode não ser idêntico ao valor de tempo. A pequena diferença causada pelo cálculo é suficiente para produzir um resultado falso (0) quando compara um valor armazenado com um valor constante.

Para receber resultados precisos quando compara valores de tempo, utilize um dos seguintes métodos. Para testar cada método, escreva cada método na janela Imediato e, em seguida, prima ENTER:

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

var1 = #1/1/99 14:01:00#

var2 = DateAdd("n", 10, var1)

? var2 = #1/1/99 14:11:00#

Converta os valores de tempo em tipos de dados de cadeia antes de os comparar:

var1 = #14:01:00#

var2 = DateAdd("n", 10, var1)

? CStr(var2) = CStr(#14:11:00#)

Utilize a função DateDiff() para comparar unidades precisas, como segundos:

var1 = #14:01:00#

var2 = DateAdd("n", 10, var1)

? DateDiff("s", var2, #2:11:00 PM#) = 0

Referências

Para obter mais informações sobre como calcular valores de data e valores de hora, veja Função DateSerial

Para obter mais informações sobre como formatar tipos de dados Data/Hora, clique em Ajuda do Microsoft Access no menu Ajuda , escreva a propriedade formato – tipo de dados de data/hora no Assistente do Office ou no Assistente de Respostas e, em seguida, clique em Procurar para ver o tópico.