2

私が現在取り組んでいるプロジェクトでは、システムは従業員のタイムテーブルを次の構造のテーブルに保存します。

employee_id | mon_h_s | mon_m_s | mon_h_e | mon_s_e | tue_h_s | tue_m_s | etc.
------------------------------------------------------------------------------
      1         06         00        14        30        06        00     ...
      2         18         30        07        00        21        00     ...

どこ:

mon_h_s- 月曜日の開始時間

mon_m_s- 月曜日の議事録開始

mon_h_e- 月曜日の終了時間

mon_m_e- 月曜日の議事録終了

tue_...- 火曜日...

曜日ごとに 4 つのフィールドがあります: 時間開始、分開始、時間終了、分終了です。

したがって、上の表から次のことがわかります。

  • ID 1の従業員は、月曜日の06:00から14:30まで勤務します

  • ID 2の従業員は、月曜日の18:30から07:00まで(基本的に、月曜日から火曜日までの間、夜間) 勤務します。

問題は、時間の重複 (夜間) を含むすべてを考慮した SQL クエリを作成する方法がわからないことです。たとえば、火曜日の午前 6 時 (06:00) に勤務する従業員を検索する必要があります。この場合、両方の従業員 (id 1 と id 2) がこの基準を満たします。ID 1 の従業員は火曜日の 06:00 に勤務を開始し、ID 2 の従業員は火曜日の 07:00 まで勤務します (月曜日に開始します)。

この問題を解決する方法についての提案は大歓迎です。

4

2 に答える 2

0

おそらく次のようなものです:

SELECT (1440 + ((mon_h_e*60)+mon_m_e) - ((mon_h_e*60)+mon_m_e)) % 1440

これにより、作業時間が分単位で表示されます。基本的には、終了時刻と開始時刻の差に 1440 (1 日分、または 24h*60min/h) を加算し、残り (モジュロ) の 1440 を維持します。

次に、設計部分です。

可能であれば、テーブルを再設計してください。あなたのテーブルは、週のすべての曜日を一列に並べる必要はありません。

実際の日時の使用を検討する必要があります。

従業員 ID | 入場時間 | 終了時間
          1 | 2011-10-31 06:00:00 | 2011-10-31 14:30:00
          1 | 2011-11-01 06:00:00 | ヌル
          2 | 2011-10-31 18:30:00 | 2011-11-01 07:00:00
          2 | 2011-11-01 21:00:00 | ヌル

そうすれば、次のようになります。

  1. MySQL のすべての日時関数へのフル アクセス
  2. 期間の簡単な計算
  3. 不完全な期間の簡単なフィルタリング
于 2011-11-01T16:18:14.323 に答える