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.
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:
- Abra o banco de dados de exemplo Northwind.mdb.
- Crie um módulo e digite a seguinte linha na seção Declarações caso ainda não esteja lá:
- Digite a seguinte função:
Function GetElapsedDays (interval)
Dim days As Long
days = Int(CSng(interval))
GetElapsedDays = days & " Days "
End Function - Para testar a função, crie uma nova consulta com base na tabela Pedidos.
- Na grade QBE, adicione os seguintes campos.
Campo: ShippedDate
Apresenta: Verdadeiro
Campo: OrderDate
Apresenta: Verdadeiro
Campo: ElapsedTime: GetElapsedDays([ShippedDate]-[OrderDate])
Apresenta: Verdadeiro - 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:
-
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 - 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 - Crie um módulo e digite as seguintes linhas na seção Declarações:
- 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.
- Para testar a função, crie um novo relatório com base na tabela TimeLog, usando o Assistente de AutoRelatório.
- Exiba o relatório no modo Design.
- 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 - 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.
- 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 - Exiba a tabela TimeCard no modo de exibição folha de dados, insira estes quatro registros e feche a tabela:
- Crie um módulo e digite a seguinte linha na seção Declarações caso ainda não esteja lá:
- 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 -
Para testar o procedimento, digite a seguinte linha na janela Imediata e pressione ENTER:
Observe que a janela Immediate exibe 32 horas e 7 minutos.
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