Microsoft Access 掲示板

営業日ベースの日付の羅列から連続する開始日と終了日を計算 / 12

15 コメント
views
4 フォロー
12
hiroton 2022/09/20 (火) 16:14:13 20947@f966d

レコードの前後を比較するのはデータベースにとって苦手な処理です。複雑な処理を組むのも、その処理速度もデータベースにやらせるメリットはありません

このようなデータは、「計算で求められるデータ」であっても実データとして保存してしまうほうがシンプルに済みます

ただし、実データとして保存する場合は、それが常に最新のデータであると保証する必要があります。データの更新タイミングと、その内容を理論的に説明できるかということですね

カレンダーテーブルを作る

翌営業日の登録があるデータは連続休暇の最終日ではないので、翌営業日は何日か?という基礎データを作成します
内容は、全日付のカレンダーで、休日フラグ(土日祝日)を設けます。これで、翌営業日は「休日を除いて、対象の日付より大きく、最小の日付」として求められます。

翌営業日:DMin("日付", "カレンダー", "休日フラグ = False And 日付>#" & 休暇取得日 & "#")

Q素データ改

SELECT 氏名, 休暇取得日, DMin("日付","カレンダー","休日フラグ = False And 日付>#" & [休暇取得日] & "#")+0 AS 翌営業日
FROM 素データ;

翌営業日が求められたら、翌営業日が存在するレコードは終了日ではないので、それを取り除くことにより終了日のリストを作成できます

Q終了日リスト

SELECT Q素データ改.氏名, Q素データ改.休暇取得日
FROM Q素データ改 LEFT JOIN 素データ ON Q素データ改.翌営業日 = 素データ.休暇取得日
WHERE 素データ.休暇取得日 Is Null;

終了日のリストができたら、「自身の日付以上で最小の日付」が休暇期間の終了日になるので、素データのすべてのレコードに対して終了日を設定し、グループ化して休暇取得日の最小を取れば求めるデータになります

SELECT 氏名, Min(休暇取得日) AS 開始日, DMin("休暇取得日","クエリ15","氏名='" & 氏名 & "' And 休暇取得日>=#" & 休暇取得日 & "#") AS 終了日
FROM 素データ
GROUP BY 氏名, DMin("休暇取得日","クエリ15","氏名='" & 氏名 & "' And 休暇取得日>=#" & 休暇取得日 & "#");

急に祝日が変わった(東京オリンピックのときとか)などに注意すれば変更することのないデータが元になるのでシンプルでしょう
また、「翌営業日」を求める計算は何度計算しても結果が変わらないのでカレンダーテーブルにフィールドを設けて保存してしまってもいいと思います

通報 ...