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での日付計算はバッチリです。
最初は少し難しく感じるかもしれませんが、何度か使っているうちに自然と身につきますよ。
ぜひ実務で活用してみてください!
広告
