プロが教える店舗&オフィスのセキュリティ対策術

Accessのクエリーにて、開始日と終了日から該当月の貸し出し期間の算出方法を教えて下さい。

条件ですが、
月単位での算出の為、1ヶ月は「1」、半月は「0.5」で算出します。

当月に開始された明細では、
15日までに開始されれば1ヶ月で算出
16日以降に開始されれば半月で算出

当月に終了された明細では、
15日までに終了されれば半年で算出
16日以降に終了されれば1ヶ月で算出

同月内に開始・終了の場合は1ヶ月で算出

貸し出し中の明細の場合、「終了日」はNULLです。

算出年月 200712の場合のデータは下記の通りです
「算出年月」、「開始日」、「終了日」、
200712、20071210、、、期間は「1」
200712、20071220、、、期間は「0.5」
200712、20050505、20071219、期間は「1」
200712、20061222、、、期間は「1」
200712、20071201、20071210、期間は「1」

宜しくお願い致します。

A 回答 (2件)

データは長整数型ですよね?



条件を整理します。

1ヶ月と計算されるのは、
(a)当月の開始・終了の場合(この場合、日付は関係なし)
(b)開始日が当月15日以前、終了日が当月16日以後(又は貸し出し中)

半月と計算されるのは、
(c)開始日が当月で、16日以後。
(d)終了日が当月で、15日以前。
但し、上記の(a)に該当する場合は、(a)の条件を優先。

上記の条件を具体的な式で表わすと下記。

(a) (Int(Nz(開始日,99999999)/100) = 算出年月) AND (Int(Nz(終了日,99999999)/100) = 算出年月)

(b) (Nz(開始日,99999999) <= 算出年月 * 100 + 15) AND (算出年月 * 100 + 16 <= Nz(終了日,99999999))

(c) (Int(Nz(開始日,99999999)/100) = 算出年月) AND (算出年月 * 100 + 16 <= Nz(開始日,99999999))

(d) (Int(Nz(終了日,99999999)/100) = 算出年月) AND (Nz(終了日,99999999) <= 算出年月 * 100 + 15)


求める値は、下記の様になります。

IIf( (a) OR (b), 1, IIf( (c) OR (d), 0.5, 0) )


式を代入して、下記で完成。

IIf( ((Int(Nz(開始日,99999999)/100) = 算出年月) AND (Int(Nz(終了日,99999999)/100) = 算出年月)) OR ((Nz(開始日,99999999) <= 算出年月 * 100 + 15) AND (算出年月 * 100 + 16 <= Nz(終了日,99999999))), 1, IIf( ((Int(Nz(開始日,99999999)/100) = 算出年月) AND (算出年月 * 100 + 16 <= Nz(開始日,99999999))) OR ((Int(Nz(終了日,99999999)/100) = 算出年月) AND (Nz(終了日,99999999) <= 算出年月 * 100 + 15)), 0.5, 0) )

かなり複雑ですね。(^^;

これでもまだ、矛盾するデータを考慮していません。
・開始日がNullで、終了日がある。
・終了日が開始日以前。

この辺りも考慮する必要があれば、もう少し条件を加える必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
うまくいきました!

>>これでもまだ、矛盾するデータを考慮していません。
>>・開始日がNullで、終了日がある。
>>・終了日が開始日以前。
これに関しては入力時にチェックしてますので大丈夫です。

ありがとうございました。

お礼日時:2008/01/09 23:05

算出年月というのは意味のないフィールドですね



期間: IIf([開始日]<20071216,0.5,0)+IIf(Nz([終了日],20071231)>=20071215,0.5,0)

開始日、終了日も日付時刻型のほうがいいのでは
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2008/01/09 23:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す