Accessの日付関数についてお探しですね。

広告

Accessの日付関数を使いこなす!日数計算・年齢計算・期限管理の実務テクニック

Accessで売上日、請求日、納期、生年月日などを扱っていると、「今日の日付でデータを抽出したい」「30日後の期限を計算したい」「開始日から終了日までの日数を知りたい」「年齢を正しく計算したい」といった日付の処理が必ず出てきますよね。

見た目は同じ日付でも、Access内部では日付型・文字列型・時刻付き日時がきちんと区別されています。

そのため、Excelと同じ感覚で扱ってしまうと、思わぬエラーや計算ミスにつながることがあります。

この記事では、Accessの日付関数をまとめて解説します。

DateAddやDateDiffを使った日数計算・年齢計算から、年月の取り出し方、Format関数、DateSerial関数、日付変換の注意点まで、実務ですぐに使える形で整理していきます。

1. Accessの日付関数の基本:Date、Now、日付型の考え方

Accessで日付を扱うとき、最初に押さえておきたいのは**「画面に表示されている形」と「データの中身」は別物**ということです。

たとえば画面上で「2026/05/10」と見えていても、それが**日付/時刻型**として保存されている場合と、**テキスト型の文字列**として保存されている場合では、計算や抽出の結果が変わってきます。

日付/時刻型なら、今日以降のデータ抽出、30日前から今日までの範囲指定、月末日の計算などが正しく行えます。

でも文字列型のままだと、見た目は日付でもAccessは単なる文字の並びとして扱うので、日付計算には向きません。

今日の日付を取得する「Date()」

今日の日付を取得する基本の関数は**Date()関数**です。

Date関数は時刻を含まない現在の日付を返すので、クエリの抽出条件やフォームの初期値によく使われます。

たとえば注文日が今日のレコードを抽出したい場合、抽出条件に「**Date()**」と入力すれば、今日の日付と一致するデータを対象にできます。

日時まで必要なら「Now()」

現在の日時まで必要な場合は**Now()関数**を使います。

Now関数は日付だけでなく時刻も含むので、更新日時や登録日時、作業ログの記録には適しています。

ただし、日付だけで比較したい場面では注意が必要です。

時刻付きデータの落とし穴

実務でよくあるのが、**日付フィールドに時刻が混ざっているケース**です。

たとえば「2026/05/10 14:30:00」という値は、日付としては同じ5月10日ですが、Date()が返す「2026/05/10 00:00:00」とは完全に一致しません。

そのため、時刻付きの注文日時から今日のデータを抽出するなら、次のように**範囲で指定する**と安全です。

“`
[注文日時] >= Date() And [注文日時] < DateAdd(“d”, 1, Date())
“`

これは「今日の0時以上かつ明日の0時未満」という意味です。

この考え方を覚えておくと、「あるはずのデータが出てこない」というトラブルを減らせます。

日付リテラルの書き方

固定の日付をクエリやVBAに直接書く場合は、**日付リテラル**として「**#2026/05/10#**」のように「#」で囲みます。

文字列の「”2026/05/10″」とは意味が異なるので、日付として比較・計算したいときは日付型で扱うことが大切です。

外部データの日付に注意

外部のCSVやExcelから取り込んだデータでは、「20260510」のような8桁の文字列になっていることもあります。

この場合はそのままCDate関数に渡すのではなく、年・月・日の間にスラッシュを補ってから日付型に変換する必要があります。

日付関数を正しく使う前提として、**まず対象フィールドが日付型なのか文字列型なのかを確認すること**が大切です。

2. DateAddで日付を足す・引く:期限、納期、月末計算に使う

**DateAdd関数**は、指定した日付に対して年・月・日・時間などを加算または減算する関数です。

基本の書き方は次のとおりです。

“`
DateAdd(“単位”, 数値, 日付)
“`

今日から7日後、請求日から1か月後、契約開始日から1年後といった計算に使えます。

基本的な使い方

たとえば今日から30日後を求めるなら次のように書きます。

“`
DateAdd(“d”, 30, Date())
“`

注文日から7日後の出荷予定日を求めるなら次のようになります。

“`
DateAdd(“d”, 7, [注文日])
“`

数値にマイナスを指定すれば過去の日付も求められます。

過去30日間のデータを抽出するなら次のように書けます。

“`
[注文日] >= DateAdd(“d”, -30, Date())
“`

よく使う単位の指定

DateAddでよく使う単位は次のとおりです。

– **”yyyy”** … 年
– **”m”** … 月
– **”d”** … 日
– **”h”** … 時
– **”n”** … 分
– **”s”** … 秒

ここで間違えやすいのが、**「m」は月を意味し、分は「n」を使う**という点です。

Excelや他のツールの感覚で分を「m」と書いてしまうと、意図しない月単位の計算になってしまいます。

日付だけでなく時刻まで扱う勤怠管理やログ管理では、この違いが結果に大きく影響します。

Accessの関数式は短く書ける一方で、単位の指定を誤るとエラーにならずに別の結果が返ることもあります。

式を作ったら、サンプルデータで必ず確認すると安心です。

月単位の加算が便利

月単位の加算では、DateAddの便利さが特に分かります。

たとえば「2026/01/31」の1か月後を単純に日数で計算しようとすると、2月の日数やうるう年を考慮しなければなりません。

でも次のように月単位で加算すれば、Accessがカレンダー上の妥当な日付に調整してくれます。

“`
DateAdd(“m”, 1, #2026/01/31#)
“`

支払期限、契約更新日、次回点検日など、業務では「30日後」ではなく「1か月後」として管理したい場面が多くあります。

日数で足すべきか、月数で足すべきかを業務ルールに合わせて選ぶことが、正確な期限管理につながります。

月末日を求める方法

月末日を求めたい場合は、DateAddだけでなく**DateSerial関数**を組み合わせると分かりやすくなります。

今月の月末は次のように求められます。

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

DateSerialは「年・月・日」から日付を作る関数です。

日付に0を指定すると「その月の1日の前日」を返します。

つまり「翌月の0日目」は今月末になるという考え方です。

注文日の月末を求めるなら次のように書きます。

“`
DateSerial(Year([注文日]), Month([注文日]) + 1, 0)
“`

請求締日や月次集計の基準日を作るときに非常に便利な式です。

3. DateDiffで日数差・経過期間・年齢を計算する

**DateDiff関数**は、2つの日付の差を指定した単位で求める関数です。

基本の書き方は次のとおりです。

“`
DateDiff(“単位”, 開始日, 終了日)
“`

開始日から終了日までの日数、月数、年数などを計算できます。

日数差の計算

たとえば開始日から終了日までの日数を求めるなら次のように書きます。

“`
DateDiff(“d”, [開始日], [終了日])
“`

今日から納期までの残り日数なら次のようになります。

“`
DateDiff(“d”, Date(), [納期])
“`

終了日が開始日より前の場合はマイナスの値が返るので、納期遅れの判定にも使えます。

たとえば残り日数が0未満なら期限超過、0なら当日、1以上なら期限内というように、IIf関数と組み合わせてステータス表示を作ることもできます。

単位による「差」の数え方に注意

DateDiffを使うときに注意したいのは、**単位によって「差」の数え方が変わる**ことです。

日数差を求める「”d”」は比較的わかりやすいですが、月数差の「”m”」や年数差の「”yyyy”」は、単純に経過した満月数・満年数を返すわけではありません。

特に年齢計算で次のように書くと、誕生日がまだ来ていない人まで1歳多く表示されることがあります。

“`
DateDiff(“yyyy”, [生年月日], Date())
“`

これは年の境界をまたいだ回数を数える考え方に近く、満年齢とは一致しない場合があるためです。

年齢を扱う場合は、DateDiffの結果をそのまま採用せず、**誕生日を迎えているかどうかの補正が必要**です。

満年齢を求める実務的な方法

Accessで満年齢を求める実務的な方法としては、今日の日付と生年月日を「yyyymmdd」形式の数値のように比較し、差を10000で割って整数部分を取る方法がよく使われます。

クエリの演算フィールドでは、次のように書けます。

“`
年齢: Int((Format(Date(),”yyyymmdd”) – Format([生年月日],”yyyymmdd”)) / 10000)
“`

この式では、たとえば今日が2026年5月10日で、生年月日が2000年6月1日の場合、20260510から20000601を引き、10000で割った整数部分を取ります。

誕生日がまだ来ていない場合は小数部分に反映されるので、満年齢として自然な結果になります。

Format関数の戻り値は文字列ですが、この式では「yyyymmdd」の形にそろえたうえで差を取るので、年齢計算の定番的な手法として利用できます。

ただし、生年月日がNullの場合はエラーや不正な結果につながるので、必要に応じてIIf関数やIsNull関数で空欄対策を入れます。

DateDiffで厳密に年齢を補正する方法

より厳密にDateDiffを使って年齢を補正する方法もあります。

考え方は、まず「DateDiff(“yyyy”, [生年月日], Date())」で年の差を求め、今年の誕生日が今日より後であれば1を引くというものです。

式はやや長くなりますが、誕生日を迎えたかどうかを明示的に判定できるので、仕組みを理解しやすい利点があります。

顧客管理、会員管理、従業員台帳などで年齢を表示する場合は、単純な年差ではなく**満年齢で計算すること**が大切です。

年齢が1歳ずれると、対象者抽出や帳票の信頼性にも影響するので、DateDiffの特性を理解して式を選びましょう。

4. 年月抽出・Format・文字列変換でつまずかないコツ

日付から年、月、日だけを取り出したい場合は、**Year関数、Month関数、Day関数**を使います。

年月日を取り出す基本

たとえば注文日から年を取り出すなら次のように書きます。

“`
Year([注文日])
“`

月なら次のようになります。

“`
Month([注文日])
“`

日なら次のとおりです。

“`
Day([注文日])
“`

これらの戻り値は数値なので、年度別・月別の集計や抽出条件に使いやすいのが特徴です。

たとえば「Month([注文日])=5」とすれば、注文日の月が5月のデータを抽出できます。

ただし、年を指定せずに月だけで抽出すると、すべての年の5月が対象になります。

特定の年の5月だけを抽出したい場合は、Year関数とMonth関数を組み合わせるか、月初から月末までの日付範囲で指定する方が正確です。

Format関数で表示を整える

「2026/05」のような年月表示を作りたい場合は、**Format関数**が便利です。

たとえば次のように書けば、注文日を年月形式の文字列として表示できます。

“`
Format([注文日],”yyyy/mm”)
“`

月別集計の見出しやレポート表示では非常に使いやすい関数ですが、重要なのは**Format関数の戻り値が日付型ではなく文字列型になる**ことです。

表示用には適していますが、日付計算や日付範囲の比較にそのまま使うと、意図しない並び順や抽出結果になることがあります。

**計算や比較では元の日付フィールドを使い、表示だけFormatで整える**という使い分けが基本です。

今月分のデータを抽出する方法

今月分のデータを抽出する場合は、Formatで「yyyy/mm」が一致するかを比較する方法もありますが、パフォーマンスや正確性を考えると**日付範囲で指定する方が実務向き**です。

たとえば今月のデータは次のように抽出できます。

“`
Between DateSerial(Year(Date()), Month(Date()), 1) And DateSerial(Year(Date()), Month(Date()) + 1, 0)
“`

時刻が含まれる日時フィールドなら、月末日の23:59:59までを考えるより、次のように「今月1日以上かつ翌月1日未満」で指定すると安全です。

“`
[注文日時] >= DateSerial(Year(Date()), Month(Date()), 1) And [注文日時] < DateSerial(Year(Date()), Month(Date()) + 1, 1)
“`

時刻付きデータでは、**終了条件を「未満」にする考え方**が安定します。

外部データの日付変換

外部システムから取り込んだCSVでは、「20260510」のような8桁の文字列が日付として入っていることがあります。

このデータはAccessから見ると日付ではなく文字列なので、そのままDateAddやDateDiffに使うのは避けるべきです。

変換するには次のように、年・月・日を切り出してスラッシュでつなぎ、CDateで日付型にします。

“`
CDate(Left([受付日文字],4) & “/” & Mid([受付日文字],5,2) & “/” & Right([受付日文字],2))
“`

逆に日付型を「20260510」の8桁文字列として出力したい場合は、次のように書きます。

“`
Format([注文日],”yyyymmdd”)
“`

ただし、変換後は文字列になるので、他システム連携やCSV出力の直前で行うのが望ましいです。

エラーを防ぐNull対策

日付変換でエラーを防ぐには、**Nullや不正な日付への対策**も欠かせません。

たとえば「20260230」や空欄が混ざっている状態でCDateを実行すると、データ型不一致などのエラーが発生する可能性があります。

安全に処理するなら、**IsDate関数**で日付として有効かを確認し、IIf関数で変換可否を分ける方法があります。

例として次のように書けば、有効な日付だけを変換し、不正な値はNullにできます。

“`
IIf(IsDate(Left([受付日文字],4) & “/” & Mid([受付日文字],5,2) & “/” & Right([受付日文字],2)), CDate(Left([受付日文字],4) & “/” & Mid([受付日文字],5,2) & “/” & Right([受付日文字],2)), Null)
“`

Accessの日付関数は単体で覚えるより、**日付型・文字列型・Null対策までセットで理解する**と、クエリ、フォーム、レポート、VBAのどこでも安定して使えるようになります。

まとめ

Accessの日付関数は、実務で必ず使う重要な機能です。

– **Date()とNow()**で今日の日付・現在日時を取得
– **DateAdd**で期限や納期を計算
– **DateDiff**で日数差や年齢を求める
– **Year、Month、Day**で年月日を取り出す
– **Format**で表示を整える(ただし文字列になる)
– **DateSerial**で月末日や特定の日付を作る

日付型と文字列型の違い、時刻付きデータの扱い方、Null対策まで意識すれば、日付処理のトラブルはぐっと減ります。

この記事を参考に、Accessの日付関数を使いこなしてみてください!

広告