[Access] 日付型へ変換

Oracle や SQLServer と違い、8桁の数値型日付 (yyyymmdd形式の数値)を日付型に変換するのが面倒なのがAccessだったりします (トホホ
SQLServerもそうですが、MicroSoft系のデータベースの日付の扱いはさらに面倒です!
(SQLServerの日付型への変換についてはこちら)

*
DateSerial関数を使用すれば良いのです。

-- Access
DateSerial ( year, month, day )

return : 日付型
year : 年 (100~9999)
month : 月
day : 日

※yearに -1900~99の指定も可能ですが、2000年を基準にプラスした年になります。
0は2000年、10は2010年、-10は1990年になります。

古い時代に年を2桁で指定するという愚かな仕様があったため、下位互換?という意味でこのような仕様になっていると推測します。
(あっ!今でもあります(笑))

まぁ、このような仕様があったため、過去には2000年問題とか色々あったわけですが…
(次は2100年問題ですかね?(笑))

今後、AccessやExcelで日付型の数値を扱うときは年も下2桁だけではなく、きちんと4桁使用するようにしたほうがよろしいかと…

 

*
では、2015年1月31日を表す 20150131という数値を日付型に変換する方法を以下に…

まず、20150131という数値から年を取得するには、以下のようにします。

 SELECT Int(20150131/10000)
;

結果は 2015

20150131 を 10000 で割ると 2015.0131 になります。それを Int関数に渡すと小数点以下の数値が消え、2015 になります。

 

*
次に、20150131という数値から月を取得するには、以下のようにします。

 SELECT Int(20150131/100) Mod 100
;

結果は 1

20150131 を 100 で割ると 201501.31 になります。それを Int関数に渡すと小数点以下の数値が消え、201501 になります。
さらに Mod関数で 201501を 100 で割ったときの余りを取得し、1になります。

 

*
最後に、20150131という数値から日を取得するには、以下のようにします。

 SELECT 20150131 Mod 100
;

結果は 31

Mod関数で 20150131 を 100 で割ったときの余りを取得し、31になります。

 

*
では、1撃のもとに 20150131 という数値を日付型に変換するには…

 SELECT DateSerial(
            Int(20150131/10000),
            Int(20150131/100) Mod 100,
            20150131 Mod 100)
;

結果は日付型の 2015/01/31

 

ほら、簡単でしょ?
ほら、面倒でしょ?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です