その日がその月の第何週目にあるのかを求める

f:id:accs2014:20160914230532p:plain:right:w200

 ある日付について、その日がその月の第何週に属しているのかを求める方法です。
 なお、1つの週はある特定の曜日から始まるものとします。例えば週が日曜日から始まる場合、ある月の初日(1日)が土曜日であれば第1週はその日のみで終わり、2日(日曜日)から第2週が始まることになります。
 また、例として右のようなテーブルを用います。


週が日曜日から始まる場合

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

 最も一般的なケースです。
 クエリデザインで次のような列を設けます(画像にある「曜日」列は参考のために表示しているもので、必要はありません)。



第何週: DateDiff("ww",DateSerial(Year([日付]),Month([日付]),1),[日付])+1

 DateDiff関数により、日付が属する月の初日(1日)と日付との間に日曜日がいくつあるかを数え、それに1を足すという計算をしています(より正確に言えば日曜日の数ではなく土曜日から日曜日への移行が何回あるかを数えていますので、日付として1日の日曜日を指定したとしてもDateDiff関数の戻り値は0となり、これに1を足しても結果は1です。つまり、いきなり2週目から始まることはありません)。


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

 データシートビューです。
 日曜で週が切り替わっており、求める値が得られていることが分かります。


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

 念のため日曜から始まる月をみてみましたが、いきなり2週目から始まるようなことはありません。


 ちなみにですが、上記の式のDateSerial関数のかわりにFormat関数を用いて次のように記入しても同じ結果となります(いかにも雑でお勧めはしませんが)。

第何週: DateDiff("ww",Format([日付],"ge/m"),[日付])+1


週が日曜日以外から始まる場合

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

 例として、週が水曜日から始まる場合、次のような列を設けます。



第何週: DateDiff("ww",DateSerial(Year([日付]),Month([日付]),1),[日付],4)+1

 上記の例とほぼ同じであり、違いはDateDiff関数に第4引数として「4」を指定しているだけです。
 DateDiff関数の第4引数は週の始めの曜日を指定するためのものであり、1なら日曜から、2なら月曜から、(中略)、4なら水曜から、(中略)、7なら土曜から始まるものとみなされます。省略した場合は1を指定した場合と同じく日曜から始まるものとみなされますので、最初の例のようになります。


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

 データシートビューです。
 水曜で週が切り替わっており、求める値が得られていることが分かります。