日付が日付型ではなくテキスト型のフィールドに記録されている場合があります。
それが例えば「2017/07/19」とか「昭和57年11月8日」といった形式であれば必要に応じて日付型のデータと同じように計算に用いることもできます。しかし、形式によってはそうもいかず困る場合があります。
以下では、テキスト型のフィールドに記録されているさまざまな形式の文字列を、日付とみなされる形式に改め、実際に日付とみなされることを示すためにCDate関数により日付型に変換する例を見てみます。
日付型に直接変換できる例
一見変わった形式でも、日付としてみなされる、つまりそのまま日付型に変換できる形式があります。
右の例の「日付」列(テキスト型。以下同様)の値は、いずれも日付としてみなされる形式です。すべてを網羅しているわけではありませんが、「-」が「/」の代わりになること、全角でもよいこと、などがポイントです。
証拠としてクエリでCDate関数を用いて日付型に変換してみます。
設ける列は次のとおりです。
変換後:Cdate([日付])
データシートビューです。
いずれも日付に変換されているのがわかります。
「20170916」形式の場合
西暦の年月日が区切りなしで8桁表示されている場合です。
例として右のようなテーブルを用います。
クエリデザインです。
次のような列を設けます。Format関数により、年月日の区切りとみなされるスラッシュ(/)を加えるというわけです。
変換後: CDate(Format([日付],"@@@@\/@@\/@@"))
※「\」がバックスラッシュとして表示されているかもしれません。
データシートビューです。
「H29.9.16」形式の場合
和暦の元号がアルファベットで表されていて、年月日がピリオド(.)で区切られて表現されている場合です。
例として右のようなテーブルを用います。
クエリデザインです。
次のような列を設けます。Replace関数により、ピリオドを年月日の区切りとみなされるスラッシュ(/)に変換するというわけです。
アルファベットの元号はそのまま認識されますので、何も変える必要はありません。
変換後: CDate(Replace([日付],".","/"))
データシートビューです。
「平29.9.16」形式の場合
和暦の元号が漢字1文字で表されていて、年月日がピリオド(.)で区切られて表現されている場合です。
例として右のようなテーブルを用います。
クエリデザインです。
次のような列を設けます。Replace関数により、ピリオドを年月日の区切りとみなされるスラッシュ(/)に変換するというわけです。
漢字1文字の元号はそのまま認識されますので、何も変える必要はありません。
変換後: CDate(Replace([日付],".","/"))
データシートビューです。
さて、上記の式は1つ上の例と全く同じものです。元号はアルファベット(M,T,S,H)だろうが漢字1文字(明,大,昭,平)だろうが漢字2文字(明治,大正,昭和,平成)だろうがきちんと認識されますので、書き換える必要はないのです。
「4290916」形式の場合
元号がコード化されており1が明治、2が大正、3が昭和、4が平成を表していて、あとの6桁は区切なしで年月日を表している、という場合です。
例として右のようなテーブルを用います。
クエリデザインです。
次のような列を設けます。Choose関数により最初の1字を元号に変換し、あとはFormat関数により年月日の区切りとみなされるスラッシュ(/)を加えるというわけです。
変換後: CDate(Choose(Left([日付],1),"M","T","S","H") & Format(Right([日付],6),"@@\/@@\/@@"))
※「\」がバックスラッシュとして表示されているかもしれません。
データシートビューです。
いくつかの例をみてみましたが、基本的には元号はそのままとし、年月日が区切なしの固定長で表されているならならFormat関数でスラッシュを加え、年月日の区切りとしてみなされない記号(ピリオドなど)で区切られているならReplace関数でスラッシュに変換する、というのが確実な方法です。