ID do artigo: 210604 - Última revisão: quinta-feira, 22 de março de 2007 - Revisão: 5.1

Funções de cálculo e de exibição de valores Data/Hora no Access

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Moderado: requer conhecimentos básicos de macro, codificação e interoperabilidade.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Como um valor Data/Hora é armazenado como um número de precisão dupla, é possível receber resultados de formatação incorretos ao tentar manipular valores Data/Hora em uma expressão. Este artigo demonstra como criar expressões e funções personalizadas para exibir datas específicas e para calcular intervalos de tempo.

A Microsoft fornece exemplos de programação apenas para fins ilustrativos, sem garantia explícita ou implícita. Isto inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação a um determinado propósito. Este artigo pressupõe que você conhece a linguagem de programação demonstrada e as ferramentas usadas para criar e depurar os procedimentos. Os engenheiros de suporte da Microsoft podem ajudá-lo, fornecendo a explicação da funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para fornecer funcionalidades adicionais ou construir procedimentos específicos para atender às suas necessidades específicas.

Mais Informações

Exibindo datas específicas

Para exibir datas específicas, é possível usar a função DateSerial() para manipular partes de dia, mês e ano de uma data. Por exemplo, é possível usar as seguintes expressões na propriedade ControlSource de uma caixa de texto ou na janela Immediate para retornar às datas específicas:
  • O mês atual:
    DateSerial(Ano(Data()), Mês(Data()), 1)
  • O próximo mês:
    DateSerial(Ano(Data()), Mês(Data()) + 1, 1)
  • O último dia do mês atual:
    DateSerial(Ano(Data()), Mês(Data()) + 1, 0)
  • O último dia do próximo mês:
    DateSerial(Ano(Data()), Mês(Data()) + 2, 0)
  • O primeiro dia do mês anterior:
    DateSerial(Ano(Data()), Mês(Data())-1,1)
  • O último dia do mês anterior:
    DateSerial(Ano(Data()), Mês(Data()),0)
  • O primeiro dia do trimestre atual:
    DateSerial(Ano(Data()), Int((Mês(Data()) - 1) / 3) * 3 + 1, 1)
  • O último dia do trimestre atual:
    DateSerial(Ano(Data()), Int((Mês(Data()) - 1) / 3) * 3 + 4, 0)
  • O primeiro dia da semana atual (considerando que domingo = dia 1):
    Data() - DiaSem(Data()) + 1
  • O último dia da semana atual:
    Data() - DiaSem(Data()) + 7
  • O primeiro dia da semana atual (usando definições na caixa de diálogo Opções):
    Data() - DiaSem(Data()) + 1
  • O último dia da semana atual:
    Data() - DiaSem(Data(), 0) + 7
Para obter mais informações sobre como calcular o ano fiscal ou mês fiscal, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento Microsoft (a página pode estar em inglês):
210249  (http://support.microsoft.com/kb/210249/ ) Como obter o ano ou o mês fiscal de uma determinada data no Access 2000
CUIDADO: caso execute as etapas deste exemplo, você modificará o banco de dados de exemplo Northwind.mdb. Convém fazer backup do arquivo Northwind.mdb e seguir estas etapas em uma cópia do banco de dados.

Calculando intervalos de tempo

Devido ao valor de hora ficar armazenado como uma fração de um dia com 24 horas, é possível receber resultados de formatação incorretos ao tentar adicionar, subtrair, multiplicar ou dividir dados de hora maiores do que 24 horas.

Por exemplo, caso tente encontrar o número de horas decorridas entre duas datas subtraindo os valores no Visual Basic, é possível receber um número incorreto. Como demonstração, digite o seguinte código na janela Imediato e perceba que será retornado um valor de 0:00 hora, e não o valor correto de 53:00 horas
   StartDate=#6/1/93 8:00AM#
   EndDate=#6/3/93 1:00PM#
   ?Format(EndDate-StartDate,"hh:mm")

Para resolver problemas de formatação causados por valores de hora maiores do que 24 horas, é possível usar as funções Int() e CSng() no Visual Basic para separar um valor de hora calculado em variáveis diferentes para dias, horas, minutos e segundos. Por exemplo, é possível incluir o seguinte fragmento de código em uma função personalizada para criar variáveis de hora separadas:
 '-------------------------------------------------------------------
 ' This sample code separates a time interval into seven variables for
 ' the following values: days, hours, minutes, seconds, total time in
 ' hours, total time in minutes, and total time in seconds.
 '
 ' The interval argument is flexible; it can be a single value, an
 ' expression, or a field reference.
 '-------------------------------------------------------------------

 Dim totalhours As Long, totalminutes As Long, totalseconds As Long
 Dim days As Long, hours As Long, minutes As Long, seconds As Long
 Dim interval As Variant

 days = Int(CSng(interval))
 totalhours = Int(CSng(interval * 24))
 totalminutes = Int(CSng(interval * 1440))
 totalseconds = Int(CSng(interval * 86400))
 hours = totalhours Mod 24
 minutes = totalminutes Mod 60
 seconds = totalseconds Mod 60

É possível usar as variáveis totalhours, totalminutes e totalseconds para exibir um valor de hora como sendo uma única unidade de tempo. As variáveis de dias, horas, minutos e segundos o habilitam para dividir um valor de hora em partes de tempo. Para exibir valores de hora em formatos diferentes, é possível concatenar estas variáveis conforme demonstrado nas seguintes funções de exemplo:
  • A função GetElapsedDays() calcula a hora decorrida entre dois valores de data/hora e exibe o resultado em dias.
  • A função GetElapsedTime() calcula a hora decorrida entre valores de tempo e exibe o resultado em dias, horas, minutos e segundos.
  • A função GetTimeCardTotal() soma um campo de valores de tempo em uma tabela e exibe o total em horas e minutos.

Função de exemplo GetElapsedDays()

Para criar a função GetElapsedDays(), execute as seguintes etapas:
  1. Abra o banco de dados de exemplo Northwind.mdb.
  2. Crie um módulo e digite a seguinte linha na seção Declarações caso ainda não esteja lá:
     Option Explicit
  3. Digite a seguinte função:
     Function GetElapsedDays (interval)
        Dim days As Long
    
        days = Int(CSng(interval))
        GetElapsedDays = days & " Days "
     End Function
  4. Para testar a função, crie uma nova consulta com base na tabela Pedidos.
  5. Na grade QBE, adicione os seguintes campos.
        Campo: ShippedDate
        Apresenta: Verdadeiro
    
        Campo: OrderDate
        Apresenta: Verdadeiro
    
        Campo: ElapsedTime: GetElapsedDays([ShippedDate]-[OrderDate])
        Apresenta: Verdadeiro
  6. Execute a consulta. Observe que a coluna ElapsedTime exibe o número de dias entre o campo ShippedDate e o campo OrderDate para cada registro na tabela Pedidos.

Função de exemplo GetElapsedTime()

Para criar a função GetElapsedTime(), execute as seguintes etapas:
  1. Crie uma nova tabela com a seguinte estrutura e salve como TimeLog.
        Tabela: TimeLog
        -----------------------
        Nome do campo: Hora de início
        Tipo de dados: Data/Hora
        Formato: Data geral
    
        Nome do campo: Hora de término
        Tipo de dados: Data/Hora
        Formato: Data geral
  2. Exiba a tabela TimeLog no modo de exibição folha de dados, insira estes três registros e feche a tabela:
        Hora de início                Hora de término
        --------------------------------------------
        5/10/95 16:57:00         5/15/95 2:38:00 
        5/11/95 10:17:31       5/24/95 18:05:00 
        5/18/95 9:16:43         5/19/95 17:03:00
  3. Crie um módulo e digite as seguintes linhas na seção Declarações:
     Option Explicit
  4. Insira a seguinte função:
     Function GetElapsedTime(interval)
    
     Dim totalhours As Long, totalminutes As Long, totalseconds As _
         Long
     Dim days As Long, hours As Long, Minutes As Long, Seconds As Long
    
     days = Int(CSng(interval))
     totalhours = Int(CSng(interval * 24))
     totalminutes = Int(CSng(interval * 1440))
     totalseconds = Int(CSng(interval * 86400))
     hours = totalhours Mod 24
     Minutes = totalminutes Mod 60
     Seconds = totalseconds Mod 60
    
     GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
     " Minutes " & Seconds & " Seconds "
    
     End Function

    OBSERVAÇÃO: A função GetElapsedTime exige que você informe uma data e uma hora.
  5. Para testar a função, crie um novo relatório com base na tabela TimeLog, usando o Assistente de AutoRelatório.
  6. Exiba o relatório no modo Design.
  7. Adicione uma caixa de texto não acoplada à seção de detalhes da tabela TimeLog e defina suas propriedades da seguinte forma:
        Caixa de texto
        ---------------
        Nome: ElapsedTime
        OrigemDoControle: =GetElapsedTime([Hora de término]-[Hora de início])
        Largura: 3 polegadas
  8. Visualize o relatório. Observe que cada registro exibe o tempo total decorrido em dias, horas, minutos e segundos.

Função de amostra GetTimeCardTotal()

Para criar a função GetTimeCardTotal(), execute as seguintes etapas:

OBSERVAÇÃO: O código de exemplo neste artigo usa o Microsoft Data Access Objects. Para este código ser executado corretamente, é necessário referenciar a biblioteca de objetos Microsoft DAO 3.6. Para fazer isto, clique em Referências no menu Ferramentas no Editor do Visual Basic e verifique a caixa de seleção Microsoft DAO 3.6 Object Library está marcada.

  1. Crie uma nova tabela com a seguinte estrutura e salve-a como TimeCard.
        Tabela: CartãoPonto
        -----------------------
        Nome do campo: Horas diárias
        Tipo de dados: Data/Hora
        Formato: Hora abreviada
  2. Exiba a tabela TimeCard no modo de exibição folha de dados, insira estes quatro registros e feche a tabela:
        8:15
        7:37
        8:12
        8:03
  3. Crie um módulo e digite a seguinte linha na seção Declarações caso ainda não esteja lá:
     Option Explicit
  4. Digite a seguinte função:
      Function GetTimeCardTotal ()   Dim db As DAO.Database, rs As DAO.Recordset  Dim totalhours As Long, totalminutes As Long  Dim days As Long, hours As Long, minutes As Long  Dim interval As Variant, j As Integer   Set db = dbengine.workspaces(0).databases(0)  Set rs = db.OpenRecordset("timecard")  interval = #12:00:00 AM#     While Not rs.EOF        interval = interval + rs![Daily hours]        rs.MoveNext     Wend  totalhours = Int(CSng(interval * 24))  totalminutes = Int(CSng(interval * 1440))  hours = totalhours Mod 24  minutes = totalminutes Mod 60   GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes"   End Function
  5. Para testar o procedimento, digite a seguinte linha na janela Imediata e pressione ENTER:
     ?GetTimeCardTotal()

    Observe que a janela Immediate exibe 32 horas e 7 minutos.

Referências

Para obter mais informações sobre como calcular valores de Data/Hora, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento Microsoft (a página pode estar em inglês):
210276  (http://support.microsoft.com/kb/210276/ ) Como armazenar, calcular e comparar dados data/hora no Microsoft Acess

A informação contida neste artigo aplica-se a:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
Palavras-chave: 
kbhowto kbprogramming KB210604