Microsoft Access で日付/時刻データを格納、計算、比較する方法

概要

この記事では、Microsoft Access が日付/時刻データ型を格納する方法について説明します。 この記事では、日付と時刻を計算したり、日付と時刻を比較したりするときに予期しない結果を受け取る理由についても説明します。

この記事では、次のトピックについて説明します。

  • 日付/時刻データを格納する
  • 日付/時刻フィールドの書式設定
  • 時間データを計算する
  • 日付データを比較する
  • 時間データの比較

詳細情報

日付/時刻データを格納する

Access は、日付/時刻データ型を小数点以下 15 桁までの倍精度浮動小数点数として格納します。 倍精度数値の整数部分は、日付を表します。 小数部は時刻を表します。

有効な日付値の範囲は、-657,434 (100 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 を乗算します。

次の表は、Access が日付/時刻の値を格納する方法を示しています。

二重番号 日付部分 実際の日付 時間の部分 実際の時間
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 秒
36836.125 36836 2000 年 11 月 6 日 .125 午前 3:00:00

Access が日付/時刻の値を数値として格納する方法を表示するには、[イミディエイト] ウィンドウに次のコマンドを入力し、Enter キーを押して結果を確認します。

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

結果が等しい: 36298.5833333333

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

結果が等しい: -18278.7305555556

数値の日付と時刻を表示するには、[イミディエイト] ウィンドウに次のコマンドを入力し、Enter キーを押して結果を確認します。

?CVDate(1.375)

結果が等しい: 12/31/1899 9:00:00 AM

?CVDate(-304398.575)

結果が等しい: 8/1/1066 1:48:00 PM

日付/時刻フィールドの書式設定

日付/時刻の値を書式設定して、日付、時刻、またはその両方を表示できます。 日付のみの形式を使用する場合、Access は時刻部分の値 0 を格納します。 時間のみの形式を使用する場合、Access は日付部分の値 0 を格納します。

次の表は、Access が日付/時刻の値を格納する方法を示しています。 次の表は、さまざまな形式を使用してこれらの値を表示する方法も示しています。

格納された値 (2 つの数値) 既定の形式 (全般日付) カスタム形式 (mm/dd/yyyy hh:nn:ss A.M./P.M.)
36295.0 5/15/99 1999 年 5 月 15 日午前 12:00:00
0.546527777777778 午後 1:07 12/30/1899 01:07:00 PM
36232.9375 3/13/99 10:30 PM 03/13/1999 10:30:00 PM

メモ 日付/時刻の値の既定の形式は [全般日付] です。 値が日付のみの場合、時刻は表示されません。 値が時刻のみの場合、日付は表示されません。

時間データを計算する

時刻値は 1 日 24 時間を 1 とした比率として格納されるため、24 時間を超える時間間隔を計算すると、誤った形式の結果が返される場合があります。 この動作を回避するには、ユーザー定義関数を作成して、時間間隔が正しく書式設定されていることを確認します。

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。 正しく計算し、時間間隔を書式設定するには、次の手順に従います。

  1. モジュールを作成し、次の行がまだ存在しない場合は、[宣言] セクションに次の行を入力します。

    Option Explicit

  2. 次の手順を入力します。

    '------------------------------------------------------------------
    '  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. [イミディエイト] ウィンドウに次の行を入力し、Enter キーを押します。

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

次の値が表示されます。

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

日付データを比較する

日付と時刻が倍精度数値としてまとめて格納されることが理由で、日付/時刻データを比較したときに予期しない結果が返される場合があります。 たとえば、[イミディエイト] ウィンドウに次の式を入力すると、今日の日付が 1999 年 3 月 31 日であっても False の結果が返されます。

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

Now() 関数は、現在の日付と現在の時刻を表す倍精度数値を返します。 ただし、DateValue() 関数は、日付を表す整数値を返しますが、小数部の時刻値は返しません。 したがって、Now() が DateValue() と等しいのは、Now() が 00:00:00 (午前 12:00:00) の時刻を返す場合のみです。

日付値を比較するときに正確な結果を得るには、次のいずれかの関数を使用します。 各関数をテストするには、[イミディエイト] ウィンドウに関数を入力し、現在の日付を 1999 年 3 月 31 日に置き換えて、Enter キーを押します。

  • 整数値を返すには、Date() 関数を使用します。

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

  • Now() 関数の小数部を削除するには、Int() 関数を使用します。

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

時間データの比較

時間値を比較すると、倍精度浮動小数点数の小数部分として時間値が格納されるため、一貫性のない結果が得られます。 たとえば、[イミディエイト] ウィンドウに次の式を入力すると、2 つの時刻値が同じように見えても false (0) の結果が返されます。

var1 = #2:01:00 PM#

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

? var2 = #2:11:00 PM#

Access が時間値を分数に変換する場合、計算結果が時間値と同一でない可能性があります。 格納された値を定数値と比較する場合、計算によって生じる小さな違いは false (0) の結果を生成するのに十分です。

時刻値を比較するときに正確な結果を得るには、次のいずれかのメソッドを使用します。 各メソッドをテストするには、[イミディエイト] ウィンドウに各メソッドを入力し、Enter キーを押します。

関連付けられた日付を時刻の比較に追加します。

var1 = #1/1/99 2:01:00 PM#

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

? var2 = #1/1/99 2:11:00 PM#

比較する前に、時刻値を文字列データ型に変換します。

var1 = #2:01:00 PM#

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

? CStr(var2) = CStr(#2:11:00 PM#)

DateDiff() 関数を使用して、秒などの正確な単位を比較します。

var1 = #2:01:00 PM#

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

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

関連情報

日付値と時刻値の計算の詳細については、「DateSerial 関数」を参照してください。

日付/時刻データ型の書式を設定する方法の詳細については、[ヘルプ] メニューの [Microsoft Access ヘルプ] をクリックし、Office Assistant または応答ウィザードで「format プロパティ - date/time データ型」と入力し、[検索] をクリックしてトピックを表示します。