0

説明 私は、選択した期間(たとえば、午前9時から午前11時まで)の可変時間(10/15/20または30分)のタイムスロットを予約できる(複数の)アジェンダを使用してアジェンダシステムを作成しています。月曜日と午前10時30分から午後3時まで)

もちろん、PHPでこれを実行し、表示されているすべての日付で使用可能なすべてのタイムスロットの予定と可用性のテーブルをポーリングできますが、サーバーに少し負荷がかかるように聞こえます。そのため、タイムスロットと可用性のタプルを示すmySQL結果リレーションを生成する方法があるかどうか疑問に思いました。

データベース/テーブルのセットアップ これは私が必要だと思ったテーブルのセットアップです。

予定 holds the appointments already made
ID| intunique id
agenda_id | intunique id identifying the agenda
start | date_timestart of the appointment
end | date_timeend of the appointment
いくつかのより説明的なフィールド

可用性 when are there which time slots available
agenda_id| int identifying which agenda
day_of_the_week | int which day, eg 1=monday
start_time | 時間 e.g. 09:00:00 end_time| 時間e.g. 11:00:00
time_slot| inthow long are the time slots? e.g. 10minutes

(備考:
必要に応じて、time_slotsフィールドをハードコーディングすることもできます。
システムはMySQLデータベースで実行され、必要に応じてpostgresqlに切り替えることができます

望ましい結果 日付2013-02-21とagenda_id 1(および必要に応じてタイムスロット15)と8:00から18:00までの営業日が与えられます。
mysqlクエリ、ビュー、またはストアドプロシージャを作成して、次のテーブル/リレーションを作成するにはどうすればよいですか。

date       | 8:00 | 8:15 | 8:30 | 8:45 | 9:00 | 9:15 | ..... | 17:15 | 17:30 | 17:45 |
2013-02-21 |   0  |  0   |   0  |  0   |  1   |   2  | ..... |   2   |   2   |   1   |

ここで、
0=予約
不可1=利用可能、このタイムスロットを予約可能
2 =利用不可、予約が存在する

4

2 に答える 2

1

PostgreSQL に切り替えることにした場合は、バージョン 9.2 (またはそれ以降) を使用していることを確認して、範囲型除外制約を最大限に活用できるようにすることをお勧めします。GiST インデックスはこの種のデータに非常に役立ちますが、除外制約によって自動的に作成されるため、明示的に宣言する必要はおそらくありません。特定の範囲内で利用可能な空きを一覧表示する場合は、generate_series関数を使用して候補時間を既存のスケジュールと結合NOT x && yし、利用できない時間を除外することができます。

MySQL に相当するものが何であるかはわかりません。

于 2013-02-09T20:18:26.543 に答える
0

予定をピボットして、空き状況と比較したいと考えています。これは、条件付き集計を使用した結合および集計クエリです。以下が考え方です。

select agendaId, const.thedate,
       sum(case when thedate + interval 8 hour + interval 0 minute between ap.start and ap.end
                then 1 else 0
           end) as "8:00",
       sum(case when thedate + interval 8 hour + interval 15 minute between ap.start and ap.end
                then 1 else 0
           end) as "8:15",
       . . .
from (select date('2013-02-21' ) as thedate) const cross join
     Availability a left outer join
     Appointments ap
     on a.AgendaId = ap.AgendaId and
        const.day_of_the_week = weekday(const.thedate)        
where date(ap.start) = const.thedate 
group by AgendaId
于 2013-02-09T20:03:27.567 に答える