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

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


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

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

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


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:w400

 クエリデザインです。
 次のような列を設けます。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:w400

 クエリデザインです。
 次のような列を設けます。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:w400

 クエリデザインです。
 次のような列を設けます。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:w400

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



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

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


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

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


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