0

ユーザーが指定した日付範囲が利用可能かどうかを確認できる必要があります。booked開始日、終了日、およびその期間に予約された部屋の数を保持するデータベースで呼び出されるテーブルがあります。

私のbookedテーブルが次のようになっているとしましょう:

room_id | start      | end        | amount_of_rooms_booked
1       | 2012-12-12 | 2012-12-15 | 2
1       | 2012-12-13 | 2012-12-16 | 3
1       | 2012-12-18 | 2012-12-19 | 1

1 日に合計 8 部屋が利用可能で、ユーザーが から の間にroom_idこの部屋を要求した場合、1日あたりの予約済み部屋数が 8 を超えないかどうかを確認するクエリを実行できますか。2012-12-102012-12-20SUM

これを行う別の方法は、毎日を個別に保存し、booked代わりに次のようなテーブルを作成することです。

room_id | start      | amount_of_rooms_booked
1       | 2012-12-12 | 2
1       | 2012-12-13 | 5
1       | 2012-12-14 | 5
1       | 2012-12-15 | 3
1       | 2012-12-18 | 1

その方法はデータベースでより多くのスペースを使用しますが、おそらくより簡単です。どちらをすればよいですか?そして、最初のアイデアがあれば、どのようにクエリを実行しますか? 私がやろうとしていることを達成するための他のより良い方法はありますか?

4

3 に答える 3

0

元の質問に答えるには、次のようにします。

SELECT SUM(amount_of_rooms_booked) FROM booked
WHERE (start BETWEEN '2012-12-10' AND '2012-12-20' OR
       end BETWEEN '2012-12-10' AND '2012-12-20')
AND room_id = 1

保存方法は問題ないと思いますが、「mount_of_rooms_booked」列の行ではなく、部屋の予約ごとに 1 つの行を保存することになるでしょう。その場合、上記のクエリは SUM ではなく COUNT クエリになります。

于 2013-01-05T20:15:02.770 に答える
0

部屋ごとに予約日ごとに行を作成することをお勧めします。

その構造を使用すると、考えられるすべての計算が簡単になります。はい、テーブルに多くのデータがあるという欠点がありますが、データベースには思ったほど影響しません。日付を使用した複雑な計算を回避できるため、ほとんどのクエリが高速になると思います。

したがって、2番目の方法の私の長所は次のとおりです。

  • ユーザーの思考モデルに一致します(ほとんど)
  • SQLはもっと簡単です!そしてより速く(ほとんど)
  • 維持しやすい
  • データをきれいに保つのが簡単 (おそらく)
于 2013-01-10T14:19:07.210 に答える
0

最初のオプションとして、いつでもこのような関数を使用できます。

次に、特定の日付に予約が 8 件未満の部屋を返す次のようなクエリがあります (私は SQL Server を使用しています)。

SELECT D.theDate, SUM(amount_of_rooms_booked) AS [amount_of_rooms_booked]
FROM
          booked
INNER JOIN
          dbo.ExplodeDates('20121210','20121220') D ON D.thedate BETWEEN booked.start AND booked.end
WHERE
          booked.room_id = @room
GROUP BY
          booked.room_id, D.thedate
HAVING
          SUM(amount_of_rooms_booked) < @bookingLimit

ただし、この練習が最善かどうかはわかりません。解釈が複雑でなく、別の種類のクエリが必要かどうかわからないため、2番目のオプションを使用したいと思います。

于 2013-01-05T22:08:59.593 に答える