日付を表す文字列を日付型に変換する

 日付が日付型ではなくテキスト型のフィールドに記録されている場合があります。 
 それが例えば「2017/07/19」とか「昭和57年11月8日」といった形式であれば必要に応じて日付型のデータと同じように計算に用いることもできます。しかし、形式によってはそうもいかず困る場合があります。
 以下では、テキスト型のフィールドに記録されているさまざまな形式の文字列を、日付とみなされる形式に改め、実際に日付とみなされることを示すためにCDate関数により日付型に変換する例を見てみます。


日付型に直接変換できる例

f:id:accs2014:20170727000934p:plain:right:w400

 一見変わった形式でも、日付としてみなされる、つまりそのまま日付型に変換できる形式があります。
 右の例の「日付」列(テキスト型。以下同様)の値は、いずれも日付としてみなされる形式です。すべてを網羅しているわけではありませんが、「-」が「/」の代わりになること、全角でもよいこと、などがポイントです。


f:id:accs2014:20170727000931p:plain:right:w400

 証拠としてクエリでCDate関数を用いて日付型に変換してみます。
 設ける列は次のとおりです。

変換後:Cdate([日付])


f:id:accs2014:20170727000923p:plain:right:w400

 データシートビューです。
 いずれも日付に変換されているのがわかります。


「20170916」形式の場合

f:id:accs2014:20170727000918p:plain:right:w400

 西暦の年月日が区切りなしで8桁表示されている場合です。
 例として右のようなテーブルを用います。


f:id:accs2014:20170727000914p:plain:right:w500

 クエリデザインです。
 次のような列を設けます。Format関数により、年月日の区切りとみなされるスラッシュ(/)を加えるというわけです。



変換後: CDate(Format([日付],"@@@@\/@@\/@@"))

※「\」がバックスラッシュとして表示されているかもしれません。


f:id:accs2014:20170727001016p:plain:right:w400

 データシートビューです。


「H29.9.16」形式の場合

f:id:accs2014:20170727001011p:plain:right:w400

 和暦の元号がアルファベットで表されていて、年月日がピリオド(.)で区切られて表現されている場合です。
 例として右のようなテーブルを用います。


f:id:accs2014:20170727001008p:plain:right:w500

 クエリデザインです。
 次のような列を設けます。Replace関数により、ピリオドを年月日の区切りとみなされるスラッシュ(/)に変換するというわけです。
 アルファベットの元号はそのまま認識されますので、何も変える必要はありません。



変換後: CDate(Replace([日付],".","/"))


f:id:accs2014:20170727001004p:plain:right:w400

 データシートビューです。


「平29.9.16」形式の場合

f:id:accs2014:20170727001001p:plain:right:w400

 和暦の元号が漢字1文字で表されていて、年月日がピリオド(.)で区切られて表現されている場合です。
 例として右のようなテーブルを用います。


f:id:accs2014:20170727001128p:plain:right:w500

 クエリデザインです。
 次のような列を設けます。Replace関数により、ピリオドを年月日の区切りとみなされるスラッシュ(/)に変換するというわけです。
 漢字1文字の元号はそのまま認識されますので、何も変える必要はありません。



変換後: CDate(Replace([日付],".","/"))


f:id:accs2014:20170727001121p:plain:right:w400

 データシートビューです。
 さて、上記の式は1つ上の例と全く同じものです。元号はアルファベット(M,T,S,H)だろうが漢字1文字(明,大,昭,平)だろうが漢字2文字(明治,大正,昭和,平成)だろうがきちんと認識されますので、書き換える必要はないのです。


「4290916」形式の場合

f:id:accs2014:20170727001118p:plain:right:w400

 元号がコード化されており1が明治、2が大正、3が昭和、4が平成を表していて、あとの6桁は区切なしで年月日を表している、という場合です。
 例として右のようなテーブルを用います。
 

f:id:accs2014:20170727001110p:plain:right:w550

 クエリデザインです。
 次のような列を設けます。Choose関数により最初の1字を元号に変換し、あとはFormat関数により年月日の区切りとみなされるスラッシュ(/)を加えるというわけです。



変換後: CDate(Choose(Left([日付],1),"M","T","S","H") & Format(Right([日付],6),"@@\/@@\/@@"))

※「\」がバックスラッシュとして表示されているかもしれません。


f:id:accs2014:20170727001107p:plain:right:w400

 データシートビューです。


 いくつかの例をみてみましたが、基本的には元号はそのままとし、年月日が区切なしの固定長で表されているならならFormat関数でスラッシュを加え、年月日の区切りとしてみなされない記号(ピリオドなど)で区切られているならReplace関数でスラッシュに変換する、というのが確実な方法です。