Accessで日付計算する方法をお探しですね。

広告

Accessで日付計算をマスター!DateAdd・DateDiff関数と正確な年齢計算の方法

Accessで顧客管理システムや社員名簿を作るとき、日付や日数の計算って避けて通れないですよね。

Excelなら簡単な計算式やDATEDIF関数でサクッとできますが、Accessでは専用の関数を使う必要があります。

「○日後の日付を出したい」「二つの日付の間が何日あるか知りたい」「生年月日から正確な年齢を出したい」——こんなときに活躍するのが、DateAdd関数とDateDiff関数です。

この記事では、これらの関数の基本的な使い方から、意外とつまずきやすい正確な年齢計算のコツまで、具体例を交えてわかりやすく解説します。

Access初心者の方でも、読み終わる頃には日付計算をマスターして、実務でバッチリ使えるようになりますよ。

Accessで日付を足したり引いたりする「DateAdd関数」

特定の日付から「30日後」や「3ヶ月前」といった日付を求めたいとき、Accessでは**DateAdd関数**を使います。

書き方は「DateAdd(単位, 足す数, 基準の日付)」というシンプルな形です。

単位の部分には、日なら「”d”」、月なら「”m”」、年なら「”yyyy”」というように指定します。

この単位を変えるだけで、年・月・日・時間など、いろんな単位で計算できるんです。

実務でよくある使い方としては、見積書の有効期限を「発行日から30日後」に設定したり、契約の更新日を「開始日から1年後」に自動計算したりできます。

かなり便利な関数なので、ぜひ覚えておきましょう。

具体的な使い方

例えば、2023年4月1日から3ヶ月後の日付を知りたいときは、こう書きます。

“`

DateAdd("m", 3, #2023/04/01#)

“`

これで「2023年7月1日」が返ってきます。

逆に過去の日付を求めたいときは、数字をマイナスにすればOKです。

“`

DateAdd("d", -10, Date())

“`

「Date()」は今日の日付を取得する関数なので、この式は「今日から10日前」を意味します。

単位の指定さえ覚えてしまえば、日付計算は思い通りにできるようになりますよ。

二つの日付の間隔を計算する「DateDiff関数」

今度は、二つの日付の間がどれくらい離れているかを計算する**DateDiff関数**です。

書き方は「DateDiff(単位, 開始日, 終了日)」となります。

DateAdd関数と同じように、単位を指定することで日数・月数・年数など、いろんな形式で期間を求められます。

プロジェクトの開始日から終了日までの日数を出したり、注文日から出荷日までのリードタイムを計算したり、期間の長さを知りたいときにとても役立ちます。

ExcelのDATEDIF関数と名前が似ていますが、引数の順番や書き方がAccess独自のものなので、そこだけ注意してくださいね。

具体的な使い方

2023年1月1日から2023年12月31日までの日数を計算する場合は、こう書きます。

“`

DateDiff("d", #2023/01/01#, #2023/12/31#)

“`

これで二つの日付の間の日数が数字で返ってきます。

単位を「”ww”」にすれば週数、「”h”」にすれば時間数も計算できます。

便利ですよね。

DateDiff関数の注意点

ただし、DateDiff関数には一つクセがあります。

この関数は「指定した単位の境界を何回またいだか」をカウントする仕組みなんです。

例えば年数(”yyyy”)で計算すると、「年が変わった回数」を数えるだけなので、まだ誕生日が来ていなくても「年が明けただけで1歳年を取る」という計算になってしまいます。

だから年齢計算には、ちょっとした工夫が必要になるんです。

DateDiffだけじゃダメ?正確な年齢を計算する方法

社員や顧客の生年月日から現在の年齢を出すとき、単純にDateDiff関数で年数の差を求めるだけでは正確な年齢は出せません。

なぜかというと、DateDiff関数は「年が何回変わったか」だけを数えるからです。

まだ今年の誕生日を迎えていない人でも、年が明けた時点で1歳追加されてしまうんですね。

でも実際は、「誕生日を迎えて初めて年齢が1つ上がる」というのが一般的なルールですよね。

だから正確な年齢を出すには、「今年の誕生日がまだ来ていない人は、計算結果から1を引く」という条件分岐を組み込む必要があります。

正確な年齢計算の式

Accessでこれを実現するには、**IIf関数**(条件によって結果を変える関数)を使います。

具体的には、クエリのフィールドにこんな式を設定します。

“`

年齢: DateDiff("yyyy", [生年月日], Date()) + IIf(Format([生年月日], "mmdd") > Format(Date(), "mmdd"), -1, 0)

“`

ちょっと長いですが、仕組みはシンプルです。

式の後半部分では、**Format関数**を使って生年月日と今日の日付を「月と日(mmdd)」だけの4桁の数字に変換して比較しています。

もし生年月日の月日の方が今日より大きければ(つまり今年の誕生日がまだ来ていなければ)、-1を足す(1歳引く)という処理をしているんです。

このロジックをテンプレートとして覚えておけば、どんなデータベースでも正確な年齢計算ができるようになりますよ。

実際に使うときの注意点とコツ

クエリでDateAddやDateDiff、年齢計算の関数を使うとき、実務でよくあるトラブルと対策をいくつか紹介します。

Null値(空白)によるエラーに注意

一番多いのが「Null値(空白)」によるエラーです。

データの中に生年月日や開始日が未入力のレコードがあると、関数がエラーを返して、クエリ全体に「#Error」と表示されてしまうことがあります。

これを防ぐには、**Nz関数**を使うか、抽出条件で「Is Not Null」を指定して、日付データが入っているレコードだけを計算対象にする工夫が必要です。

実際のデータベースでは、すべてのデータが完璧に入力されているとは限らないので、エラー対策を意識した設計が大切です。

複雑な計算はVBAで関数化しよう

複雑な日付計算や条件分岐をクエリのフィールドに直接ガッツリ書き込むと、後から見返したときに「これ何の式だっけ?」となりがちです。

メンテナンスも大変になります。

そんなときは、**VBA(Visual Basic for Applications)**を使って、ユーザー定義関数として独立させるのがおすすめです。

標準モジュールに年齢を計算する関数を作っておけば、クエリからは「Age([生年月日])」みたいにシンプルに呼び出せて、Access全体の見通しがグッと良くなります。

状況に応じてクエリの標準関数とVBAを使い分けて、効率的でミスのないデータベースを作っていきましょう。

まとめ

この記事で紹介した関数と計算方法を使えば、Accessでの日付計算はバッチリです。

最初は少し難しく感じるかもしれませんが、何度か使っているうちに自然と身につきますよ。

ぜひ実務で活用してみてください!

広告