私はこの問題をしばらく解決しようとしました。 私は多くを検索しましたが、誰も同様の問題を抱えているようです。ここで2つのテーブルからdatetimeの時間間隔を見つけよう
は、私が得たものである:
Table 1/Schedule
EmployeeID, PStart, PEnd
1, 2016-07-01 08:00:00, 2016-07-01 12:00:00
1, 2016-07-01 13:00:00, 2016-07-01 17:00:00
Table 2/Bookings
EmployeeID, PStart, PEnd
1, 2016-07-01 08:00:00, 2016-07-01 08:40:00
1, 2016-07-01 09:00:00, 2016-07-01 10:10:00
1, 2016-07-01 10:30:00, 2016-07-01 11:00:00
1, 2016-07-01 13:00:00, 2016-07-01 15:00:00
1, 2016-07-01 15:00:00, 2016-07-01 15:30:00
私はこの2つのテーブルを比較し、スケジュールと予約した時間との間のギャップを取得したいです。その時間は予約されていませんでした。
Result table/Not booked
EmployeeID, PStart, PEnd
1, 2016-07-01 08:40:00, 2016-07-01 09:00:00
1, 2016-07-01 10:10:00, 2016-07-01 10:30:00
1, 2016-07-01 11:00:00, 2016-07-01 12:00:00
1, 2016-07-01 15:30:00, 2016-07-01 17:00:00
クエリの速度が非常に重要であるだろう。この例では
。従業員数は150を超えているため、多くの行があります。 時間の始めからすべてのギャップを表示するのではなく、使用予定の日付範囲が制限されている可能性があります(例えば、2週間のギャップが生じるなど)。しかし、それがクエリの速度に役立つ場合にのみ。
ありがとうございます。あなたはCTEのとROW_NUMBER()
ウィンドウ関数の組み合わせでそれを行うことができ
よろしく、 アダム
このスクリプトは本当に完璧です、それは仕事のほぼ99%をしました。 私は言及するのを忘れた別の問題があります。場合によっては、スケジュールが8〜10で開始され、別のスケジュールが10〜12で開始されることもあります。スクリプトを実行する前にそれらに参加することができるのだろうか – AdamG
元のスクリプトで2つのものを変更する必要があった 1予約していないスケジュールが全く表示されなかった 2最後の予約が最後にあったときスケジュールの (私の修正によりスクリプトが遅くなりましたが、重要ではないので、時間があれば代替スクリプトを提供できるかどうか分かります) – AdamG
予約なしでスケジュールを表示するスクリプトを修正しましたそして特別なISNULLチェック)、予約がスケジュールの終わりにあるときにどのようにギャップを取るかを示しました。それはすべてのユニオンを使用します – Balah