SSブログ

雑記 日付型について [テーブル設計]

 ある年代を境に、周知されていない日付型についてちょっと。

 VBA(およびVB)やテーブルのデータ型には日付型というのがあって、日付と時刻の扱いに特化した作りになっています。そもそも数値型は数値演算用、文字型はただ文字列を記録するためだけに作られているので、日付・時刻という特殊なルールをもっている値は、数値型やテキスト型では不都合が多いのです。
 どういう事かというと、数値型で1を加算する場合は、単純に1を加えてやれば済むのですが、日付だとそうはいきません。1日後の日付を求めようと思ったら、今日の日付の「日」の部分を取り出して、1を足して、さらに「月」を取り出して、月末日付を超えていないか確認する必要があります。月末日は月によって31、30、28と変わります。さらに閏年があるので、気が遠くなります。日の繰り上がりを考慮し、さらに月の繰り上がりも考慮しないといけません。日付型を使わない日付処理は、めんどくさいのです。昔COBOLが主流だった頃はあたりまえにルーチン書いてましたけどね。月末日とかはめんどくさいから50年分くらいテーブルに持っちゃったり。

 日付型で「日」を加減算していく場合、単純に日数を加減算してやればOKです。

例) datA = datA + 5

 日付以外の単位、「年」「月」および「時」「分」「秒」の加減算は、DateAdd関数を使います。

五ヶ月後を求める
例) datA = DateAdd("m", 5, datA)

第一パラメタに、加減算する単位を指定します。
年・・・YYYY
月・・・M
日・・・D
週・・・WW
時・・・H
分・・・N
秒・・・S

これだけ覚えていれば不便は無いはず。

 日付型から、「年」や「分」といった、特定の単位の値のみを取り出したいときは、以下の関数を用います。

Year(datA)  '年
Month(datA)  '月
Day(datA)  '日
Hour(datA)  '時
Minute(datA)  '分
Second(datA)  '秒

 で、これの逆をする関数が、DateSerialとTimeSerialです。
年・月・日、時・分・秒それぞれの値から、日付型に変換します。

例)
datA = DateSerial(2006, 1, 2)
datA = TimeSerial(12, 15, 30)

 このDateSerial関数は、ちょっとおもしろい使い方ができて、月末日を求める時に便利です。

例)システム日付の月末日付を求める
datA = DateSerial(Year(Date), Month(Date) + 1, 0)

0とか、マイナスを指定してもOKなんです。
1日は1なので、0を指定すると、その1日前を返してくれます。

 月初(1日)なら、こんなのもありでしょうか。
例) Debug.Print Format(datA, "YYYY/MM/\0\1")

 最後に、日付型の内容を、文字列として取り出すときは、必ずFormat関数を使いましょう。なにも指定しないと、そのパソコンの設定の影響を受けて、こちらの意図した動作をしてくれない原因になります。

例) Debug.Print Format(datA, "YYYY/MM/DD HH:NN:SS")

 「分」は「NN」です。お間違えなく。

 日付型は内部的には小数点ありの数値になっています。整数部分が日付を表すシリアル値で、小数部分が時刻を表しています。
 ちなみに、シリアル値が0の場合、
? FORMAT(0,"YYYY/MM/DD HH:NN:SS")
1899/12/30 00:00:00
を指します。
 最小の日付は、100年1月1日です。
 最大値は9999年12月31日 23時59分59秒まで。
 VBAの変数はNull値を持てないので、「値なし(またはローバリューとか)」の状態を表現する場合は、代わりに最小の日付を使うなどの工夫が必要になります。

 「20070515」のような、スラッシュなし数字8桁を日付型変数へ代入する場合は、以下のような変換処理をします。

例)datA = CDate(Format("20070515", "@@@@\/@@\/@@"))

 COBOLのシステムとかでは、日付を8桁の数値で持って、特殊な状態を表すのに「00000000」や「99999999」を使用していることがあります。当然日付型でこれらの値を扱うことはできないので、注意が必要です。
 日付として正しいかどうかを調べる関数として、IsDate関数があります。が、こちらの思惑と違う判断をすることが多々あるので、ある程度の工夫が必要になります。

※ 「\」(バックスラッシュ)は「¥」半角の円記号です。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。