私は3つのテーブルを持っています。時間で空室を見つける
- 私のシステムのリソースである表(t)。 最大容量です。
- 予約(b)は、 システムにおける予約、それは が
- BookedTable(BT)、テーブルを用いて、どのように多くの座席この予約によって使用さ 、 予約を接続FromDatimeTime、 ToDateTimeとnrOfPeopleをHASE 予約は複数のテーブルを持つことができます。
問題は、私は3件の予約がある場合:14:00に残し12:00 で来
- 4人を。
- 4人が12:00に来て、 が13:00に出発します。
- 13:00に来ている4人と、14:00に残している 。
すべての予約は8席の同じテーブルを使用しています。 テーブルが "オーバーブッキング"されている場合は、私はしたい。
セットアップコード
CREATE TABLE Tables (
TableNr INT,
Seats INT
)
GO
CREATE TABLE Booking
(
BookingNr INT,
Time_From DATETIME,
Time_TO DATETIME,
Guests INT
)
GO
CREATE TABLE Table_Booking
(
TableBookingId INT ,
BookingNr INT ,
TableNr INT ,
GuestOnTable int
)
GO
INSERT INTO [Tables] ( [TableNr], [Seats]) VALUES (1, 8)
INSERT INTO [Tables] ( [TableNr], [Seats]) VALUES (2, 4)
INSERT INTO [Tables] ( [TableNr], [Seats]) VALUES (3, 4)
INSERT INTO [Booking] ([BookingNr],[Time_From],[Time_TO],[Guests]) VALUES (/* BookingNr - INT */ 1,/* Time_From - DATETIME */ '2009-7-7 11:00',/* Time_TO - DATETIME */ '2009-7-7 13:00',/* Guests - INT */ 4)
INSERT INTO [Booking] ([BookingNr],[Time_From],[Time_TO],[Guests]) VALUES (/* BookingNr - INT */ 2,/* Time_From - DATETIME */ '2009-7-7 11:00',/* Time_TO - DATETIME */ '2009-7-7 12:00',/* Guests - INT */ 4)
INSERT INTO [Booking] ([BookingNr],[Time_From],[Time_TO],[Guests]) VALUES (/* BookingNr - INT */ 3,/* Time_From - DATETIME */ '2009-7-7 12:00',/* Time_TO - DATETIME */ '2009-7-7 13:00',/* Guests - INT */ 4)
INSERT INTO [Table_Booking] ([TableBookingId],[BookingNr],[TableNr], GuestOnTable) VALUES (/* TableBookingId - INT */ 1, /* BookingNr - INT */ 1,/* TableNr - INT */ 1, 4)
INSERT INTO [Table_Booking] ([TableBookingId],[BookingNr],[TableNr], GuestOnTable) VALUES (/* TableBookingId - INT */ 2, /* BookingNr - INT */ 2,/* TableNr - INT */ 1, 4)
INSERT INTO [Table_Booking] ([TableBookingId],[BookingNr],[TableNr], GuestOnTable) VALUES (/* TableBookingId - INT */ 3, /* BookingNr - INT */ 3,/* TableNr - INT */ 1, 4)
GO
簡単なテストクエリ
select Booking.BookingNr, [Booking].[Time_From], [Booking].[Time_TO], [Booking].[Guests], [Tables].TableNr ,
CASE WHEN [Tables].[Seats] -
( select sum(tbInner.[GuestOnTable]) from [Table_Booking] as tbInner
join [Booking] AS bInner on bInner.BookingNr = tbInner.BookingNr
where (NOT (Booking.Time_From>= bInner.[Time_To] OR bInner.[Time_From] >= Booking.Time_To))
) < 0 THEN 'OverBooked' ELSE 'Ok' END AS TableStatus
from [Booking]
join [Table_Booking] on [Booking].[BookingNr] = [Table_Booking].[BookingNr]
join [Tables] on [Tables].[TableNr] = [Table_Booking].[TableNr]
は私を与える: Bookingnr 1 =は、予約2及び3 = OK をオーバーブッキング。
予約を削除した場合3.期待通りの結果が得られます。問題は、3つ以上の予約が同じテーブルで時間を共有する場合です。
私は、予約時にすべての可能な時間にわたってループを行い、予約がオーバーブッキングされているかどうかをチェックするようなものに頼らず、 クエリは頻繁に使用されます。1分に1回、すべてのユーザーが1日に数百の行を使用できます。 私は、
編集1
は、それが他のもののすべての種類を行い、より大きなストアドプロシージャの一部である(しかし、私はむしろSQLでそれを行うだろう)、SQLやDelphiのデータセットのいずれかを使用することができますそれは関数である可能性があります。
私は分間隔で対処しなければならないと思います。 製品を使用しているほとんどのお客様は、テーブルの分割を許可していないため、この問題は発生しません。そして私はそれらのクエリが大幅に遅くなることを望んでいません。
あなたが関係する最小間隔はどれくらいですか?時間、分、または分ですか? –
解決策は選択可能なストアドプロシージャである可能性がありますか?それとも、単一のSQL selectでなければならないのですか? –