Poziom średni: wymaga podstawowej znajomość makr, pisania kodu i zagadnień związanych ze współdziałaniem.


Streszczenie

Wartość daty/godziny (Date/Time) jest przechowywana jako liczba podwójnej dokładności, dlatego formatowanie wyników może być niepoprawne w przypadku próby manipulowania wartościami daty/godziny w wyrażeniu. W tym artykule przedstawiono sposób tworzenia wyrażeń i niestandardowych funkcji w celu wyświetlania określonych dat i obliczania interwałów czasowych.


Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost lub domyślnie, w tym także, bez ograniczeń, ustawowej rękojmi co do przydatności handlowej lub do określonych celów. W tym artykule zakłada się, że czytelnik zna demonstrowany język programowania oraz narzędzia używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy Pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu zasad działania określonej procedury, ale nie będą modyfikować tych przykładów ani dodawać żadnej funkcji i konstruować nowych procedur w celu dostosowania ich do określonych potrzeb użytkownika.

Więcej informacji

Wyświetlanie określonych dat

Aby wyświetlić określone daty, można manipulować składnikiem dnia, miesiąca i roku w dacie przy użyciu funkcji DateSerial(). Na przykład, korzystając z następujących wyrażeń we właściwości ControlSource pola tekstowego lub w oknie Immediate, można zwrócić określone daty:

  • Bieżący miesiąc:

    DateSerial(Year(Date()), Month(Date()), 1)

  • Następny miesiąc:

    DateSerial(Year(Date()), Month(Date()) + 1, 1)

  • Ostatni dzień bieżącego miesiąca:

    DateSerial(Year(Date()), Month(Date()) + 1, 0)

  • Ostatni dzień następnego miesiąca:

    DateSerial(Year(Date()), Month(Date()) + 2, 0)

  • Pierwszy dzień poprzedniego miesiąca:

    DateSerial(Year(Date()), Month(Date())-1,1)

  • Ostatni dzień poprzedniego miesiąca:

    DateSerial(Year(Date()), Month(Date()),0)

  • Pierwszy dzień bieżącego kwartału:

    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 1, 1)

  • Ostatni dzień bieżącego kwartału:

    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 4, 0)

  • Pierwszy dzień bieżącego tygodnia (niedziela = dzień 1):

    Date() - WeekDay(Date()) + 1

  • Ostatni dzień bieżącego tygodnia:

    Date() - WeekDay(Date()) + 7

  • Pierwszy dzień bieżącego tygodnia (zgodnie z ustawieniami w oknie dialogowym Opcje):

    Date() - WeekDay(Date(), 0) + 1

  • Ostatni dzień bieżącego tygodnia:

    Date() - WeekDay(Date(), 0) + 7

Aby uzyskać więcej informacji dotyczących obliczania roku lub miesiąca obrachunkowego, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

210249 How to get the fiscal year or month of a particular date in Access 2000

PRZESTROGA: Wykonanie kroków opisanych w tym przykładzie powoduje modyfikację przykładowej bazy danych Northwind.mdb. Można wykonać kopię zapasową pliku Northwind.mdb, a następnie wykonywać te kroki na kopii bazy danych.

Obliczanie interwałów czasowych

Wartość godziny (Time) jest przechowywana jako ułamek dnia 24-godzinnego, dlatego formatowanie wyników może być niepoprawne w przypadku próby dodawania, odejmowania, mnożenia lub dzielenia danych godziny większych niż 24 godziny.


W przypadku próby obliczenia liczby godzin między dwiema datami przez odjęcie wartości w programie Visual Basic może zostać wyświetlona niepoprawna liczba. Aby zademonstrować tę procedurę, należy wpisać następujący kod w oknie Immediate i zwrócić uwagę na to, że zwracana jest wartość 0:00 godzin, a nie poprawna wartość 53:00 godziny:

   StartDate=#6/1/93 8:00AM#
EndDate=#6/3/93 1:00PM#
?Format(EndDate-StartDate,"hh:mm")


Aby rozwiązać problemy z formatowaniem związane z wartościami większymi niż 24 godziny, można użyć funkcji Int() i CSng() w programie Visual Basic w celu rozdzielenia obliczonej wartości czasu na poszczególne zmienne dni, godzin, minut i sekund. Na przykład można uwzględnić następujący fragment kodu w niestandardowej funkcji w celu utworzenia oddzielnych zmiennych czasu:

 '-------------------------------------------------------------------
' Ten kod przykładowy rozdziela interwał czasowy na siedem zmiennych dla
' następujących wartości: dni, godziny, minuty, sekundy, całkowity czas w
' godzinach, całkowity czas w minutach i całkowity czas w sekundach.
'
' Argument interwału jest elastyczny; może być pojedynczą wartością,
' wyrażeniem lub odwołaniem do pola.
'-------------------------------------------------------------------

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


Korzystając ze zmiennych: totalhours, totalminutes i totalseconds, można wyświetlić wartość czasu jako pojedynczą jednostkę czasu. Zmienne dni, godzin, minut i sekund umożliwiają podział wartości czasu na poszczególne składniki. Aby wyświetlić wartości czasu w różnych formatach, można złączyć te zmienne w sposób przedstawiony w następujących funkcjach przykładowych:

  • Funkcja GetElapsedDays() oblicza czas, który upłynął między dwiema wartościami daty/godziny, i wyświetla wyniki jako liczbę dni.

  • Funkcja GetElapsedTime() oblicza czas, który upłynął między dwiema wartościami godziny, i wyświetla wyniki jako liczbę dni, godzin, minut i sekund.

  • Funkcja GetTimeCardTotal() sumuje pole wartości godziny w tabeli i wyświetla sumę jako liczbę godzin i minut.

Funkcja przykładowa GetElapsedDays()

Aby utworzyć funkcję GetElapsedDays(), wykonaj następujące kroki:

  1. Otwórz przykładową bazę danych Northwind.mdb.

  2. Utwórz moduł i wpisz następujący wiersz w sekcji deklaracji, jeżeli nie został tam jeszcze umieszczony:

     Option Explicit
  3. Wpisz następującą funkcję:

                        
    Function GetElapsedDays (interval)
    Dim days As Long

    days = Int(CSng(interval))
    GetElapsedDays = days & " Days "
    End Function
  4. Aby przetestować tę funkcję, utwórz nową kwerendę opartą na tabeli Orders.

  5. W siatce QBE dodaj następujące pola.
    Field: ShippedDate
    Show: True

    Field: OrderDate
    Show: True

    Field: ElapsedTime: GetElapsedDays([ShippedDate]-[OrderDate])
    Show: True

  6. Uruchom kwerendę. Zauważ, że w kolumnie ElapsedTime wyświetlana jest liczba dni w okresie między datami określonymi w polach ShippedDate i OrderDate dla każdego rekordu w tabeli Orders.

Funkcja przykładowa GetElapsedTime()

Aby utworzyć funkcję GetElapsedTime(), wykonaj następujące kroki:

  1. Utwórz nową tabelę zgodną z następującą strukturą i zapisz ją jako TimeLog.

    Table: TimeLog
    -----------------------
    Field Name: StartTime
    Data Type: Date/Time
    Format: General Date

    Field Name: EndTime
    Data Type: Date/Time
    Format: General Date

  2. Otwórz tabelę TimeLog w widoku arkusza danych, wprowadź następujące trzy rekordy, a następnie zamknij tabelę:
    StartTime EndTime
    --------------------------------------------
    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. Utwórz moduł i wpisz następujący wiersz w sekcji deklaracji:

     Option Explicit
  4. Wpisz następującą funkcję:

     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


    UWAGA: Wymagane jest przekazanie daty i godziny do funkcji GetElapsedTime.

  5. Aby przetestować tę funkcję, utwórz nowy raport oparty na tabeli TimeLog, korzystając z Kreatora autoraportów.

  6. Otwórz raport w widoku projektu.

  7. Dodaj niezwiązane pole tekstowe do sekcji szczegółów tabeli TimeLog i ustaw jego właściwości w następujący sposób:
    TextBox
    ---------------
    Name: ElapsedTime
    ControlSource: =GetElapsedTime([EndTime]-[StartTime])
    Width: 3 inches

  8. Wyświetl podgląd raportu. Zauważ, że w każdym rekordzie wyświetlany jest całkowity czas, który upłynął, jako liczba dni, godzin, minut i sekund.

Funkcja przykładowa GetTimeCardTotal()

Aby utworzyć funkcję GetTimeCardTotal(), wykonaj następujące kroki:


UWAGA: W przykładowym kodzie przedstawionym w tym artykule używane są obiekty dostępu do danych Microsoft Data Access Objects. Aby ten kod działał poprawnie, trzeba odwołać się do biblioteki obiektów Microsoft DAO 3.6 Object Library. Aby to zrobić, w menu Tools Edytora Visual Basic kliknij polecenie References i upewnij się, że zaznaczone jest pole wyboru Microsoft DAO 3.6 Object Library.

  1. Utwórz nową tabelę zgodną z następującą strukturą i zapisz ją jako TimeCard.
    Table: TimeCard
    -----------------------
    Field Name: Daily Hours
    Data Type: Date/Time
    Format: Short Time

  2. Otwórz tabelę TimeCard w widoku arkusza danych, wprowadź następujące cztery rekordy, a następnie zamknij tabelę:
    8:15
    7:37
    8:12
    8:03

  3. Utwórz moduł i wpisz następujący wiersz w sekcji deklaracji, jeżeli nie został tam jeszcze umieszczony:

     Option Explicit
  4. Wpisz następującą funkcję:

                        
    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. Aby przetestować tę funkcję, wpisz następujący wiersz w oknie Immediate, a następnie naciśnij klawisz ENTER:

     ?GetTimeCardTotal()


    Zauważ, że w oknie Immediate jest wyświetlana wartość 32 godziny i 7 minut.

Materiały referencyjne

Aby uzyskać więcej informacji dotyczących obliczania wartości daty/godziny (Date/Time), kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

210276 W jaki sposób zapisywać, obliczać i porównywać w programie Access dane dotyczące Daty/Godziny

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności

Poznaj szkolenia >

Uzyskuj nowe funkcje w pierwszej kolejności

Dołącz do niejawnych testerów firmy Microsoft >

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?

Dziękujemy za opinię!

×