- Accessで今日の日付や現在日時を取得する基本
- DateAdd、DateDiff、DateSerialの日付計算の使い分け
- クエリで今日、過去30日、今月などを抽出する条件式
- 日付型と文字列型、Format関数でつまずきやすい注意点
Accessで「今日の日付を出したい」「日付を加算したい」「月末を求めたい」「日付から年・月・日だけ取り出したい」と思っても、どの関数を使えばよいか迷ったことはありませんか?
この記事では、Accessでよく使う日付関数を、実務で使いやすい形に整理して解説します。
特に次のような人向けです。
- Accessのクエリで今日の日付を条件にしたい
- Date関数とNow関数の違いを知りたい
- DateAdd、DateDiff、DateSerialの使い分けを知りたい
- 日付型と文字列型の違いでエラーになる理由を理解したい
- VBAでも同じ日付関数を使えるか確認したい
Accessの日付処理は、基本の考え方を覚えるとかなり楽になります。
まずは「今日を取得する」「日付を足す・引く」「差を求める」「年月日を取り出す」「年月日から日付を作る」という用途で整理していきましょう。
もくじ
ここからは、今日の日付を取得する基本から、日付計算、抽出条件、型の注意点まで順番に見ていきます。
よく使う式を用途ごとに確認できるので、クエリやVBAで日付を扱うときの整理にもきっと役立つでしょう。
Date関数の基本
AccessのDate関数は、今日の日付を返す関数です。
Date()
戻り値には、時刻は含まれません。
たとえば今日が2026年5月8日の場合、Date() は次のような日付を返します。
2026/05/08
Date関数は、Accessのいろいろな場所で利用可能です。
| 使う場所 | 例 | 用途 |
|---|---|---|
| クエリ | Date() | 今日の日付を表示する、今日のデータを抽出する |
| フォーム | =Date() | 今日の日付を既定値として表示する |
| VBA | Date | 処理日、作成日、抽出基準日として使う |
クエリのデザインビューで計算フィールドとして使う場合は、次のように入力します。
今日の日付: Date()
VBAで変数に入れる場合は、次のような感じです。
Dim todayValue As Date
todayValue = Date
日付のみを比較したいときは、まずDate関数を使うと考えると分かりやいです。
Date関数とNow関数の違い
Date関数と似たものに、Now関数があります。
どちらも現在の日付に関係しますが、返す値は異なります。
| 関数 | 返す値 | 例 | 向いている用途 |
|---|---|---|---|
| Date() | 今日の日付 | 2026/05/08 | 今日のデータ抽出、日付だけの比較 |
| Now() | 現在の日付と時刻 | 2026/05/08 14:30:25 | 更新日時、登録日時、ログの記録 |
Date() は日付のみ、Now() は日付と時刻の両方を返します。
そのため、日付だけで比較したい場合はDate()が向いています。
たとえば、注文日が今日のデータを抽出したい場合は、次のようにDate()を使います。
Date()
一方、レコードを更新した正確な日時を保存したい場合はNow()がおすすめです。
Now()
注意したいのは、Now()には時刻が含まれることで、日付フィールドに時刻も保存されている場合は=Date() だけでは一致しないことがあります。
まず確認したいのは、そのフィールドに時刻が必要かどうかです。
時刻が不要であれば、テーブルのフィールドプロパティの書式を yyyy/mm/dd に設定するか、入力フォームのテキストボックスの書式を日付のみに設定しておくと、時刻の混入を防げます。
既存のデータに時刻が混入している場合や、時刻付きで保存する必要がある場合は、条件式を範囲指定にするほうが安全です。
下の式は今日の0時と明日の0時の間と言う条件を指定していて、時刻を含むデータ型でも対象日でフィルターがかかっています。
注文日時 >= Date() And 注文日時 < DateAdd("d", 1, Date())
Accessの日付関数でよく使うパターン一覧
Accessの日付関数は、用途別に覚えると使いやすくなります。
| 関数 | 用途 | クエリ例 | VBA例 | 注意点 |
|---|---|---|---|---|
| Date() | 今日の日付を取得する | Date() | Date | 時刻は含まない |
| Now() | 現在の日時を取得する | Now() | Now | 時刻まで含むため日付比較では注意 |
| DateAdd() | 日付を足す、引く | DateAdd("d", 7, [注文日]) | DateAdd("d", 7, orderDate) | 第1引数で日・月・年などの単位を指定する |
| DateDiff() | 2つの日付の差を求める | DateDiff("d", [開始日], [終了日]) | DateDiff("d", startDate, endDate) | 開始日と終了日を逆にするとマイナスになる |
| DateSerial() | 年・月・日から日付を作る | DateSerial(Year(Date()), Month(Date()), 1) | DateSerial(Year(Date), Month(Date), 1) | 月末計算に便利 |
| Format() | 日付の表示形式を変える | Format([注文日], "yyyy/mm") | Format(orderDate, "yyyy/mm") | 戻り値は文字列になる |
| Year() | 日付から年を取り出す | Year([注文日]) | Year(orderDate) | 戻り値は数値 |
| Month() | 日付から月を取り出す | Month([注文日]) | Month(orderDate) | 戻り値は数値 |
| Day() | 日付から日を取り出す | Day([注文日]) | Day(orderDate) | 戻り値は数値 |
よく使う考え方は、次の5つです。
| やりたいこと | 使う関数 | 例 |
|---|---|---|
| 今日の日付を出す | Date | Date() |
| 現在時刻も含める | Now | Now() |
| 日付を加算する | DateAdd | DateAdd("d", 30, Date()) |
| 日数差を求める | DateDiff | DateDiff("d", [開始日], [終了日]) |
| 月末を求める | DateSerial | DateSerial(Year(Date()), Month(Date()) + 1, 0) |
日付関数以外も確認したい場合は、Access関数の一覧記事をあわせて見ると、関数全体の位置づけを整理しやすくなります。
クエリで今日の日付を条件にする方法
Accessの日付関数は、クエリの抽出条件でもよく使われます。
たとえば「注文日」フィールドを対象にする場合、設定できる抽出条件をまとめたのが下の表です。
| 抽出したいデータ | 抽出条件の例 | 意味 |
|---|---|---|
| 今日の日付と一致 | Date() | 注文日が今日のレコード |
| 今日以降 | >=Date() | 今日から未来のレコード |
| 今日より前 | <Date() | 昨日以前のレコード |
| 過去30日 | >=DateAdd("d", -30, Date()) | 今日から30日前以降のレコード |
| 今月 | Between DateSerial(Year(Date()), Month(Date()), 1) And DateSerial(Year(Date()), Month(Date()) + 1, 0) | 今月1日から今月末まで |
| 月末 | DateSerial(Year(Date()), Month(Date()) + 1, 0) | 今月の月末日と一致 |
SQLビューでは、次のように記述します。
SELECT *
FROM T_注文
WHERE 注文日 = Date();
今日以降のデータを抽出する場合は、条件を >=Date() にします。
SELECT *
FROM T_注文
WHERE 注文日 >= Date();
過去30日のデータを抽出したいときは、DateAdd関数で30日前の日付を作ります。
SELECT *
FROM T_注文
WHERE 注文日 >= DateAdd("d", -30, Date());
今月分を抽出する場合は、月初と月末をDateSerialで作って範囲指定します。
SELECT *
FROM T_注文
WHERE 注文日 Between DateSerial(Year(Date()), Month(Date()), 1)
And DateSerial(Year(Date()), Month(Date()) + 1, 0);
日付フィールドに時刻が含まれる可能性がある場合、=Date() だけでは一致しないことがあります。
そのときは、今日の0時以上、明日の0時未満という範囲で指定すると安全です。
SELECT *
FROM T_注文
WHERE 注文日時 >= Date()
And 注文日時 < DateAdd("d", 1, Date());
日付から年・月・日だけを取り出す方法
日付フィールドから年、月、日だけを取り出すには、Year、Month、Day関数を使います。
たとえば「注文日」フィールドから年月日を分ける場合は、次のように書きましょう。
| 取り出す値 | クエリの計算フィールド例 | 戻り値 |
|---|---|---|
| 年 | 年: Year([注文日]) | 2026 |
| 月 | 月: Month([注文日]) | 5 |
| 日 | 日: Day([注文日]) | 8 |
VBAで使う場合は、次のように記述できます。
Dim orderDate As Date
orderDate = #2026/05/08#
Debug.Print Year(orderDate)
Debug.Print Month(orderDate)
Debug.Print Day(orderDate)
月別集計などで「2026/05」のように表示したい場合は、Format関数を使います。
Format([注文日], "yyyy/mm")
ただし、Format関数の戻り値は日付型ではなく文字列型であることが重要なポイントです。
表示用やグループ化(集計)用には便利ですが、日付として計算・比較したい場合は、DateSerialやDateAddなどで日付型のまま扱うようにしましょう。
たとえば、月初の日付を日付型として作るなら次のように書きます。
DateSerial(Year([注文日]), Month([注文日]), 1)
DateAdd、DateDiff、DateSerialの使い分け
Accessの日付計算で特に迷いやすいのが、DateAdd、DateDiff、DateSerialの使い分けです。
ざっくり整理すると、次のようになります。
| 関数 | 使う場面 | 例 |
|---|---|---|
| DateAdd | 日付を足す、引く | 30日後、1か月前、1年後を求める |
| DateDiff | 2つの日付の差を求める | 経過日数、残り日数、月数差を求める |
| DateSerial | 年月日から日付を作る | 月初、月末、年度末を求める |
DateAddで日付を加算する
DateAdd関数は、日付に日数、月数、年数などを足したり引いたりする関数です。
DateAdd(単位, 数値, 日付)
よく使う単位は次のとおり。
| 単位 | 意味 | 例 |
|---|---|---|
"d" | 日 | 7日後、30日前 |
"m" | 月 | 1か月後、3か月前 |
"yyyy" | 年 | 1年後 |
今日から7日後を求める場合、単位は”d”、数値は7を指定します。
DateAdd("d", 7, Date())
今日から30日前を求める場合は、数値にマイナスを指定します。
DateAdd("d", -30, Date())
「注文日」から1か月後なら、単位は”m”、数値は1、日付はフィールド[注文日]を指定します。
DateAdd("m", 1, [注文日])
DateDiffで日数差を求める
DateDiff関数は、2つの日付の差を求める関数です。
DateDiff(単位, 開始日, 終了日)
開始日から終了日までの日数は、次の式で求めます。
DateDiff("d", [開始日], [終了日])
今日から納期までの残り日数なら、開始日にDate()を指定します。
DateDiff("d", Date(), [納期])
終了日が開始日より前の場合、結果はマイナスになります。
DateDiff("d", [納期], Date())
月数差を求めたい場合は、単位に "m" を指定します。
DateDiff("m", [開始日], [終了日])
DateSerialで日付を組み立てる
DateSerial関数は、年・月・日を指定して日付を作る関数です。
DateSerial(年, 月, 日)
今日を基準に月初を求める式は、次のとおりです。
DateSerial(Year(Date()), Month(Date()), 1)
DateSerialは、月末の計算にも便利です。
Accessでは、DateSerialの「日」に0を指定すると、指定した月の1日の前日を返せます。
たとえば、今月末を求めるには「翌月の0日目」と考えます。
DateSerial(Year(Date()), Month(Date()) + 1, 0)
この「0日は1日の前日」という考え方を覚えておくと、月末計算がかなり扱いやすくなります。
月末を求める方法
今月の月末を求める式は次のとおりです。
DateSerial(Year(Date()), Month(Date()) + 1, 0)
考え方は、先ほどの「翌月の0日目」です。
たとえば2026年5月の月末は、次のように考えます。
DateSerial(2026, 6, 0)
6月1日の1日前なので、2026年5月31日が返ります。
指定フィールドの日付を基準に月末を求める場合は、Date()ではなくフィールド名を使います。
DateSerial(Year([注文日]), Month([注文日]) + 1, 0)
前月末を求める場合は、当月の0日目を指定します。
DateSerial(Year(Date()), Month(Date()), 0)
指定フィールドの前月末なら、基準をフィールド名に置き換えます。
DateSerial(Year([注文日]), Month([注文日]), 0)
月初も一緒に使えば、今月分の範囲抽出を作れます。
月初: DateSerial(Year(Date()), Month(Date()), 1)
月末: DateSerial(Year(Date()), Month(Date()) + 1, 0)
エラーになりやすい日付型と文字列型の違い
Accessの日付処理でつまずきやすいのが、日付型と文字列型の違いです。
日付に見えていても、内部的に日付型とは限りません。
| 値の例 | 型の考え方 | 計算・比較 |
|---|---|---|
#2026/05/08# | 日付リテラル | 日付として比較できる |
"2026/05/08" | 文字列 | 見た目は日付でも文字列 |
Date() | 日付型の値 | 日付として比較できる |
Format(Date(), "yyyy/mm/dd") | 文字列 | 表示用。日付計算には注意 |
Accessのクエリ条件で日付を直接書く場合は、日付を # で囲みます。
#2026/05/08#
文字列として書く場合は、ダブルクォーテーションで囲みます。
"2026/05/08"
この2つは見た目が似ていますが、Accessでは別の値として扱われます。
#2026/05/08# → 日付
"2026/05/08" → 文字列
日付型は、日付の加算や比較ができます。
[注文日] >= #2026/05/08#
一方、文字列は表示や文字の比較として扱われます。日付のつもりで比較すると、思った結果にならないことがあります。
特にFormat関数には注意が必要です。
Format([注文日], "yyyy/mm/dd")
この式は表示形式を整えるには便利ですが、戻り値は日付型ではなく文字列型です。
そのため、日付として計算したい場合は、Formatで整形した値ではなく、元の日付フィールドやDateSerialで作った日付型の値を使いましょう。
また、日付リテラルの書き方は地域設定や表記ゆれの影響を受けることがあります。
クエリやVBAで固定日付を書く場合は、表記を統一しておくとトラブルを減らせます。
クエリで使う場合とVBAで使う場合の違い
Accessの日付関数は、クエリでもVBAでも利用できます。
ただし、書く場所によって式の見え方が少し変わります。
| 用途 | クエリでの例 | VBAでの例 |
|---|---|---|
| 今日の日付 | Date() | Date |
| 現在日時 | Now() | Now |
| 7日後 | DateAdd("d", 7, Date()) | DateAdd("d", 7, Date) |
| 日数差 | DateDiff("d", [開始日], [終了日]) | DateDiff("d", startDate, endDate) |
| 月末 | DateSerial(Year(Date()), Month(Date()) + 1, 0) | DateSerial(Year(Date), Month(Date) + 1, 0) |
クエリでは、フィールド名を角かっこで囲むことが多くあります。
DateDiff("d", [開始日], [終了日])
VBAでは、変数やフォームのコントロールを使って処理する形になります。
Dim daysLeft As Long
daysLeft = DateDiff("d", Date, Me!納期)
初心者のうちは、まずクエリで式を試して結果を確認し、必要になったらVBAに移す流れがおすすめです。
よく使う日付計算のサンプル式
最後に、実務でよく使うサンプル式をまとめます。
| やりたいこと | 式 |
|---|---|
| 今日の日付を表示 | Date() |
| 現在日時を表示 | Now() |
| 明日の日付 | DateAdd("d", 1, Date()) |
| 30日前の日付 | DateAdd("d", -30, Date()) |
| 1か月後の日付 | DateAdd("m", 1, Date()) |
| 注文日から7日後 | DateAdd("d", 7, [注文日]) |
| 開始日から終了日までの日数 | DateDiff("d", [開始日], [終了日]) |
| 今日から納期までの残り日数 | DateDiff("d", Date(), [納期]) |
| 今日の年 | Year(Date()) |
| 今日の月 | Month(Date()) |
| 今日の日 | Day(Date()) |
| 注文日の年月 | Format([注文日], "yyyy/mm") |
| 今月の月初 | DateSerial(Year(Date()), Month(Date()), 1) |
| 今月の月末 | DateSerial(Year(Date()), Month(Date()) + 1, 0) |
| 注文日の月末 | DateSerial(Year([注文日]), Month([注文日]) + 1, 0) |
| 今月のデータ抽出 | Between DateSerial(Year(Date()), Month(Date()), 1) And DateSerial(Year(Date()), Month(Date()) + 1, 0) |
FAQ
Accessで今日の日付を表示する関数は?
今日の日付を表示する関数はDate関数です。
Date()
クエリ、フォーム、VBAで使えます。時刻を含まない点が特徴です。
Date関数とNow関数はどちらを使うべき?
日付だけでよい場合は、Date関数を選びます。
Date()
登録日時や更新日時のように時刻まで必要な場合は、Now関数を使います。
Now()
日付だけで比較するなら、時刻を含まないDate関数のほうが扱いやすくなります。
クエリで今日の日付のデータだけ抽出するには?
日付フィールドの抽出条件に、次の式を入力します。
Date()
SQLビューでは、次の形になります。
SELECT *
FROM T_注文
WHERE 注文日 = Date();
日付フィールドに時刻が含まれる場合は、次のように範囲指定すると安全です。
SELECT *
FROM T_注文
WHERE 注文日時 >= Date()
And 注文日時 < DateAdd("d", 1, Date());
Formatで日付を整形すると日付型のままですか?
日付型のままではありません。
Format関数の戻り値は文字列です。
Format([注文日], "yyyy/mm/dd")
表示用には便利ですが、日付の計算や比較に使う場合は注意が必要です。
計算・比較では、元の日付フィールドやDateSerialで作った日付型を使うのがおすすめです。
月末の日付を求めるには?
今月の月末は、DateSerial関数で求めます。
DateSerial(Year(Date()), Month(Date()) + 1, 0)
指定フィールドの月末を求める場合は、Date()の代わりにフィールド名を使います。
DateSerial(Year([注文日]), Month([注文日]) + 1, 0)
「翌月の0日目」と考えると、式の意味を追いやすくなります。
まとめ
Accessの日付関数は、用途で分けると理解しやすくなります。
- 今日の日付を出すなら
Date() - 現在時刻まで必要なら
Now() - 日付を足す・引くなら
DateAdd() - 日数差や月数差を求めるなら
DateDiff() - 月初や月末を作るなら
DateSerial() - 年・月・日だけ取り出すなら
Year()、Month()、Day() - 表示形式を変えるなら
Format()
特に実務では、今日の日付を条件にした抽出、過去30日のデータ抽出、今月データの抽出、月末計算をよく使います。
日付型と文字列型の違い、#2026/05/08# のような日付リテラル、Format関数が文字列を返す点を押さえておくと、Accessの日付処理の精度が上がり、エラーの発生を減らせるでしょう。