経過時間を計算する
このトピックでは、Access での日付/時刻データ型の格納方法と、日付と時刻を計算または比較するときに予期しない結果になる場合があることの理由について説明します。
日付/時刻データを格納する
Access は、日付/時刻データ型を倍精度浮動小数点数 (小数点以下 15 位まで) として格納します。 倍精度数値の整数部が日付を表し、小数部が時刻を表します。
有効な日付値の範囲は、-647,434 (100 年 1 月 1 日、A.D.) から 2,958,465 (9999 年 12 月 31 日) までです。 日付値 0 は 1899 年 12 月 30 日を表します。 Access では、1899 年 12 月 30 日より前の日付が負の数値として格納されます。
有効な時刻値の範囲は、.0 (0 時 0 分 0 秒) ~ .99999 (23 時 59 分 59 秒) です。 この数値は、1 日を 1 とした比率で時間を表します。 この数値に 24 を掛けることで、時間、分、秒からなる時刻に変換することができます。
2 つの数値 | 日付部分 | 実際の日付 | 時間の部分 | 実際の時間 |
---|---|---|---|---|
1.0 | 1 | 1899 年 12 月 31 日 | 0.0 | 午前 0 時 0 分 0 秒 |
2.5 | 2 | 1900 年 1 月 1 日 | 0.5 | 午後 0 時 0 分 0 秒 |
27468.96875 | 27468 | 1975 年 3 月 15 日 | 0.96875 | 午後 11 時 15 分 0 秒 |
33914.125 | 33914 | 1992 年 11 月 6 日 |
時間データを計算する
時刻値は 1 日 24 時間を 1 とした比率として格納されるため、24 時間を超える時間間隔を計算すると、誤った形式の結果が返される場合があります。 この問題点に対処するために、時間間隔の形式が正しく設定されることを保証するためのユーザー定義関数を作成できます。
以下の手順は、Format 関数を使用して時間間隔の形式を設定する方法の例を示します。 手順では 2 つの時刻値を受け取り、それらの間の間隔を複数の異なる形式で [イミディエイト] ウィンドウに出力します。
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
日付データを比較する
日付と時刻が倍精度数値としてまとめて格納されることが理由で、日付/時刻データを比較したときに予期しない結果が返される場合があります。 たとえば、[イミディエイト] ウィンドウで次の式を入力した場合、今日の日付が 2006 年 7 月 11 日であっても False (0) の結果が返されます。
? Now()=DateValue("7/11/2006")
Now 関数は、現在の日付と時刻を表す倍精度数値を返します。 ただし、 DateValue 関数は日付を表す整数値を返しますが、小数部の時刻値を返しません。 結果として、 Now が 00:00:00 (午前 0 時 0 分 0 秒) の時刻を返すときにしか、 Now は DateValue と等しくなりません。
日付値を比較するときに正確な結果を得るには、次のいずれかの関数を使用します。 各関数をテストするには、関数を [イミディエイト] ウィンドウに入力し、"7/11/2006" の部分を現在の日付に置き換え、Enter キーを押します。
整数値を返すには、 Date 関数を使用します。
?Date()=DateValue("7/11/2006")
Now 関数の小数部を削除するには、Int 関数を使用します。
?Int(Now())=DateValue("7/11/2006")
時間データの比較
時刻値を比較するとき、時刻値が倍精度浮動小数点数の小数部として格納されることが理由で、矛盾した結果が返される場合があります。 たとえば、[イミディエイト] ウィンドウで次の式を入力すると、2 つの時刻値は同じであるように見えるにもかかわらず False (0) の結果が返されます。
var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #2:11:00 PM#
Access が時刻値を小数に変換するとき、計算結果は時刻値と厳密に等価でない場合があります。 計算によって引き起こされるごくわずかな違いでも、格納された値を定数値と比較するときに False (0) の結果が返される理由となります。
時刻値を比較するときに正確な結果を得るには、次のいずれかのメソッドを使用します。 各メソッドをテストするには、[イミディエイト] ウィンドウでメソッドを入力して Enter キーを押します。
関連付けられた日付を時刻の比較に追加します。
var1 = #7/11/2006 2:00:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #7/11/2006 2:10:00 PM#
時刻値を比較する前に、値を String データ型に変換します。
var1 = #2:00:00 PM#
var2 = DateAdd("n", 10, var1)
? CStr(var2) = CStr(#2:10:00 PM#)
DateDiff 関数を使用して、秒などの正確な単位を比較します。
var1 = #2:00:00 PM#
var2 = DateAdd("n", 10, var1)
? DateDiff("s", var2, #2:10:00 PM#) = 0
投稿者について
the ElevateAccess コミュニティによって提供されるリンク。
UtterAccess は非常に優れた Microsoft Access wiki およびヘルプ フォーラムです。
関連項目
- 開発者フォーラムにアクセスする
- support.office.com のヘルプにアクセスする
- UtterAccess のフォーラムにアクセスする
- 開発者と VBA のプログラミング ヘルプ センター (FMS) にアクセスする
- StackOverflow のアクセス ポスト
サポートとフィードバック
Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。