基本(Access)

【Access関数入門】3回目-日付計算の基礎と活用ワザ4選(Date/Year-Month-Day/DateSerial/DateDiff)

スポンサードリンク
この記事で学習できること
  • 日付関数の基本的な使い方が分かる
  • いろんなパータンの日付を組み立てられるようになる
  • 実務でよく使う日付計算パターンを効率的に処理できるようになる

Access関数の使い方をシリーズで投稿しています。

前回(2回目)は文字列操作関数の使い方を解説しました。

3回目の今回は、数ある日付関数の中から基本となる4種類をピックアップして解説していきます。

  • Excelなら日付の計算は慣れているけど、Accessだとどう書けばいいかわからない…
  • クエリで月末日を求めたいのに、毎回手動で調べている
  • 年齢計算や勤続年数の計算を自動化したいけど、複雑な式になってしまう

この記事を書いている僕自身も、Accessを学びたての時は上のような悩みを抱えていました
さらに、SNSやYahoo知恵袋でも、同じような悩みが書き込まれているのもよく見かけます。

Excelでは日付関数を直感的に組み合わせて計算できますが、Accessのクエリやフォームでは1フィールドに使えるのは1数式のみで、全レコードに同じ計算方法が適用されます。
つまり、Excelのように1セルだけで完結されず、全レコードを視野に入れて数式を組み立てる必要があるのがAccess関数の大きな特徴です。

だからこそ、Accessで日付データを思い通りに扱うためにも、日付関数の本質的な理解は優先度が高いと言えます。

本記事では、Access初学者が「どの日付関数から学んだらよいか」「実際の業務でどう活用すればよいか」がイメージできる内容に仕上げました。

また、これはAccessだけに限らず、SQL Server、MySQL、Oracle、PostgreSQLなど、あらゆるデータベースシステムで日付関数は基本機能として提供されています。
つまり、Accessで学んだ日付関数の知識を、他のデータベースシステムでも流用可能なので、学習で得られる効果がとても大きいと言えるでしょう。


今回はテーブル「T_給油記録」を使い、日付関数の実例に沿って実演していきます。

サンプルテーブル
スポンサードリンク

Date関数で「今日」を取得する(Date と Now の違い)

日付関数の中でも基本中の基本といえるものは、今日の日付を取得するDate関数です。
新しいクエリに「T_給油記録」を追加し、Date関数を設定します。

今日の日付:Date()
クエリを追加してDate関数を設定する

データシートビューを確認すると、全てのレコードに今日の日付が返されました。

今日の日付が計算された

Date関数とNow関数の違いと使い分けのコツ

似たような関数にNow関数がありますが、両者には明確な違いがあります。

  • Date関数:今日の日付のみを返します(時刻部分は含まれません) 例:2024/1/15
  • Now関数:現在の日付と時刻の両方を返します 例:2024/1/15 14:30:25
Date関数とNow関数

クエリによって得られた日付データをどのように活用するかが重要で、日付のみで十分な場合はDate関数、正確な時刻まで記録したい場合はNow関数を選択しましょう。

しかし、ほとんどのパターンではDate関数で十分に用途を満たせるはずです。
Now関数を使うのは、データの更新記録などが求められている時だけかも知れません。

クエリでDate関数を使用する際の注意点

Dateを返すだけなら、テーブルを追加する必要がないのでは?
ついそんなことを感じてしまい、試しにテーブルがない状態でDate関数を設定してみたところ、「ビューを切り替える時にデータシートビューを選択できない」という結果になってしまいました。

データシートを表示できない

Date関数をクエリに設定するときは、テーブルを追加するのを忘れないようにしましょう。

Year/Month/Day で年・月・日を分解する

日付データから年、月、日を個別で抜き出す方法が分からず、困ったことはありませんか?
もちろんAccessにも、この処理を簡単に実行できる関数が用意されています。

基本的な使い方

Year、Month、Day関数は、いずれも日付型のデータを引数に、年・月・日を個別に返します

実際の日付フィールドから値を抽出

では、「T_給油記録」テーブルの「給油日」フィールドを使って実践してみましょう。
まず基準となる「給油日」フィールドを選択し、続いて各抽出フィールドを設定します。

年:Year([給油日])
月:Month([給油日])
日:Day([給油日])
年月日を取り出すフィールドを設定

データシートビューで確認すると、日付データから年月日が正しく分解されて表示されます。

年月日が分割されて表示

Date関数との組み合わせ

これらの関数は、Date関数と組み合わせることで現在日付の分析にも活用できます。

年:Year(Date())
月:Month(Date())
日:Day(Date())
Date関数で年月日を表示

この設定により、今日の日付から年月日がそれぞれ抽出されます。

設定した結果

ちなみに、Year・Month・Day関数の戻り値は全て整数型です。
一方で、「03月」など、月の値を常に2桁で表示したい場合は、下のようにFormat関数との組み合わせをオススメします。

月(2桁):Format(Month([給油日]), "00")

このような使い方は、月別や年別など、期間別で集計したい時はとても有効なテクニックです。

スポンサードリンク

DateSerial で自在に日付を組み立てる(月末日・翌月初日など)

DateSerialは「年」「月」「日」のそれぞれを引数にして、自由に日付を組み立てることができる関数です。

  • 第一引数・・・年(数値型)
  • 第二引数・・・月(数値型)
  • 第三引数・・・日(数値型)

これから、DateSerial関数を使った使い方をいくつか実演してみましょう。
DateSerial関数は長くなりがちなため、ここではズームの活用がおすすめです。

ズームを開く

まずは、シンプルに「給油日」フィールドからそのままDateSerial関数を入力し、日付を返します。

  • DateSerial関数:DateSerial(Year([給油日]),Month([給油日]),Day([給油日]))
ズームでDateSeialを表示

データシートビューを確認すると、「DateSerial関数」フィールドに給油日と同じ日付が返されました。

同じ日付になった

これが基本的なDateSerial関数の使い方です。
以降は、いろいろなパターンの使い方を紹介します。

月末日を返す

月末日を計算するのはよく使う方法です。
次のように前月末日の式を入力してみましょう。

前月末:DateSerial(Year([給油日]),Month([給油日]),0)
日付を0にする

日付の部分だけを「0」にする理由は、初日(1日)より1日前だからと解釈すると分かりやすいでしょう。

データシートビューを確認すると、前月末日になっていることが確認できました。

前月末日が返された

当月末を計算する場合は、そのまま月に1を足します。

月末:DateSerial(Year([給油日]),Month([給油日])+1,0)
月に1を足して日付を0に

データシートビューを確認すると、当月末日に変わりました。

当月末日が計算された

年末や年度末を返す

年末を計算する方法も覚えておきましょう。
月を13、日を0にすると、下のような式になります。

DateSerial(Year([給油日]),13,0)
月を13に日を0に

ータシートビューを確認すると、年末になっているのが確認できました。

大晦日が返された

年度末の場合はさらに式が長くなります。

年度末:IIf(Month()>3,DateSerial(Year()+1,4,0), DateSerial(Year(),4,0))
DateSerialの組み合わせ

4~12月と1~3月では計算の方法が違うので、IIf関数でパターン分けしてあげます。
月を4、日を0にしてあげましょう。

データシートビューを確認すると、年度末日になっているのが確認できました。

年度末日が返された

このようにAccessのDateSerial関数を使えば、節目となる日を簡単に計算することができるので、ぜひ使いこなせるようになっておきましょう。

スポンサードリンク

DateDiff で日数・月数・年数を一括計算

2つの日付をもとに、期間を計算するのがDateDiff関数です。
DateDiff関数の構文は以下のとおりです。

  • 第一引数・・・期間の単位
  • 第二引数・・・開始日
  • 第三引数・・・終了日

第一引数に設定する期間の単位は、「y(年)」や「m(月)」などの表示形式を設定します。
第二引数以降に開始日と終了日を設定します。
開始日と終了日を逆さにするとマイナスで計算されます。

では、さきほどDateSerial関数で計算した「年度末日」と「給油日」の期間を計算してみましょう。

  • 残り日数:DateDiff(“d”,[給油日],[年度末])
日単位で期間を計算

データシートビューを確認すると、期間が日単位で計算されていることが確認できました。

期間が計算された

次に、月単位で期間を計算してみましょう。

  • 残り月数:DateDiff(“m”,[給油日],[年度末])
月単位で期間を計算

期間が月単位に変わりました。

月単位になった

DateDiff関数は、年齢を計算するときにも有効です。
年齢はいろんなパターンでの計算方法が存在します。

満年齢:DateDiff("yyyy", [生年月日], Date()) - IIf(Format([生年月日], "mmdd") > Format(Date(), "mmdd"), 1, 0)
数え年:DateDiff("yyyy", [生年月日], Date()) + 1
〇歳〇ヶ月表記: ( DateDiff("yyyy",[生年月日], Date()) - IIf(Format([生年月日],"mmdd") > Format(Date(),"mmdd"), 1, 0) )& "歳" & ( DateDiff("m",[生年月日], Date()) - (( DateDiff("yyyy",[生年月日], Date()) - IIf(Format([生年月日],"mmdd") > Format(Date(),"mmdd"), 1, 0)) * 12 ) - IIf(Day(Date()) < Day([生年月日]), 1, 0))& "か月"

数式が長くなる場合もありますが、DateDiff関数を基本として各種の条件分岐や書式設定を組み合わせることで、用途に応じた柔軟な年齢計算が実現できます。
また、状況によっては計算元がNullの場合、Nz関数を使ったエラー回避が有効です。

これらの計算式をマスターできれば、顧客や人事の管理システムなど、様々な業務アプリケーションで正確な年齢処理が可能になります。

まとめ

Accessの日付計算は、①Dateで“今日”を取得し、②Year / Month / Dayで分解し、③DateSerialで月末日や翌月初日を組み立て、④DateDiffで年齢や経過日数を求める——この4手順でほぼ対応できます。

必要に応じて DFormat/Nz を補助的に使えば、実務パターンを短い式で処理可能です。
迷ったら「取得 → 分解 → 組み立て → 差分」の順で考える——これだけ覚えておけばOK。

とにかく、日付関数の本質が理解できれば、Access内の日付データを思い通りに操れるようになるので、基本をしっかりと習得しておきましょう。

次回は、「D~」でつながる定義域集計関数の基本的な使い方を解説します。

スポンサードリンク

スポンサードリンク

-基本(Access)