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 休暇取得日>=#" & 休暇取得日 & "#");
急に祝日が変わった(東京オリンピックのときとか)などに注意すれば変更することのないデータが元になるのでシンプルでしょう
また、「翌営業日」を求める計算は何度計算しても結果が変わらないのでカレンダーテーブルにフィールドを設けて保存してしまってもいいと思います
通報 ...