20日締めとか4月始まりとか。。。会計月度計算 その2

さて、会計カレンダーその2です。

前回は、日付から「月度」を算出して、四半期、年と計算して行ったのですが、

年度と月度が会わない月(12月度を特別扱い)とか日付(12/21~12/31 を特別扱い)とか、ちょっと面倒な面がありました。

tableautableau.hatenablog.com

 

劇的に改善できるわけではないのですが、少しでもエレガントにしたいと思います。

加えて、カレンダー関連の数字を扱うときに一般的なやり方も含むので、他のケースでも応用可能だと思います。

それぞれの日付から直接、月、四半期、年を計算するのはその都度検証が必要で面倒だったので、今回は、あえて一段階ステップを増やして、「日付ごとに会計カレンダー用の違う日付に変更」してしまいます。

といっても、会計カレンダーの場合、「何年何月何日」を設定しようと思ったとき、「何年何月」までは問題ないのですが、「何日」で問題が生じます。

 

なぜでしょう?

 

実は例えば、20日締めで翌月になる場合、2月度は 1/21 ~2/20 となり、日数は31日となります。1/21~1/31 = 11日 、2/1~2/20 = 20日 で31日です。

つまり、2/30、2/31 という通常カレンダーでは現れない日にちが必要になるのです。
これでは、日付を 1対1でコンバートする訳にはいきません。

ですのでここでは、日付ごとにその日付の属する会見月度の最終日を割り振ることにします。

毎月20日を越えると(21日から)、通常の月度の翌月になります。

月度を計算してから「1」を足すと、13月が生じてしまうため、日付計算の計算式の中にこのロジックを取り込んでしまいます。

そうすれば、12月の翌月は自動的に1月になるし、自動的に翌年度になる訳です。

実際の計算式は、複数の日付に関する関数を使います。

[Fiscal calc date end 2]

date(
str(year(dateadd('month',iif(day([Calendar Date])>20,1,0),[Calendar Date])))
+","+
str(MONTH(dateadd('month',iif(day([Calendar Date])>20,1,0),[Calendar Date])))
+",20")

 

date() 関数は、()の中身が文字列(str)のとき、特定のFormatを満たしているとき、それを日付に変更してくれます。

目指すのは、"yyyy,mm,dd"のFormatなのですが、yyyy、mm、dd ともちょっと工夫しています。

 

yaer(日付のFormat)

  • 年を4桁の数字で返します。

dateadd('カレンダーの単位',数字,日付のFormat)

  • カッコ内の日付から、数字分の単位(月、年、週など)をずらした日付を返します。

day(日付のFormat)

  • カッコ内の日付から「日」を返します。

str(数字

  • 数字を文字列で返します。

iif(条件,x,y)

  • 条件に合致すれば xを、合致しなければ y を返します。

全部合わせて無理やり翻訳すれば、

『[Calendar date] から、20日/21日を境にして、一番近い未来の20日を日付Formatで返しなさい』

ということになるかと思います。

 

長々と書きましたが、とにかくこれで、日付ごとに一番近い未来の20日が算出できました。

月度は、この新しい日付自身の月度を

[Fiscal month 2]
month([Fiscal calc date end 2])

で計算すれば良いわけです。20日の条件分けはすでに出来てるので、そのまま月度が取得できます。

年度、四半期に関しては、そのままだと標準カレンダーに従ってしまうので、[Fiscal month 2]の月自身を3ヶ月ずらします。

ここでもdateaddを使うわけですね。

[Fiscal Year 2]
year(dateadd('month',-3,[Fiscal calc date end 2]))

 

[Fiscal Quarter 2]
datepart('quarter',(dateadd('month',-3,[Fiscal calc date end 2])))

 

ちょっとだけ簡単になってませんか?なってない。。。!?
最初の日付のコンバートが余計にややこしいですかね?

そうかも知れません。

ただ、ポイントは、アプローチのやり方が複数あるってことです。

1.『四半期や年度や月度を一旦計算した後で、特別扱いの条件を加える』

2.『四半期や年度や月度を計算する、もとの日付自体を変える』

の2つがあります。

それぞれ、その1(前回).その2(今回) に 示したことになります。

どっちのアプローチを使うべきかは、簡単さ、間違いの生じにくさ、事後の解析のし易さ でケースバイケースの判断になると思います。

 

 

それでは、ご自分で試して楽しんでください。