0

従業員の労働時間をmysqlテーブルに保存しようとしています。表working_hourには、通常の労働時間を保存しています。

id employee weekDay    start     end 
1     1       2      10:00:00  18:00:00
2     1       3      10:00:00  18:00:00
3     1       4      10:00:00  14:00:00
4     1       5      10:00:00  12:00:00
5     1       6      10:00:00  18:00:00
6     1       7      00:00:00  00:00:00
7     1       1      00:00:00  00:00:00

2番目のテーブルには、「特別な」労働時間を保存します。そこでは、病気、休日、または特定の日のカスタマイズされた労働時間などを保存します。lテーブルは次のworking_hour_speciaようになります。

id           start                   end            type
2     12013-03-12 00:00:00  2013-03-13 23:59:59      ill

そしてそれは私が試したことです:

SELECT 
    IFNULL(working_hour_special.start, working_hour.start) AS startTime,
    IFNULL(working_hour_special.end, working_hour.end) AS endTime,
    type
FROM 
    working_hour_special LEFT JOIN
    working_hour ON working_hour.employee_id = working_hour_special.employee_id
WHERE 
    working_hour_special.start = DATE('2013-03-13') AND 
    employee_id = 1 AND
    working_hour.weekDay = DAYOFWEEK('2013-03-13')

問題はWHERE-Clauseです。特定の従業員の特定の日の開始時刻と終了時刻が必要です。誰かにそれを行う方法のアイデアがありますか?

4

1 に答える 1

0

まず、テーブルのデザインが悪いようです。1 つは曜日だけですが、もう 1 つは完全な日付/時刻スタンプです。1 月第 1 週の第 1 週の曜日と、7 月 26 日の第 1 週の曜日を区別するものは何もありません。

第 2 に、左結合があり、そのテーブルを (NULL のテストを考慮せずに) WHERE 句にスローすると、基本的に通常の INNER JOIN が作成されます。

したがって、探しているのは、SPECIAL に関連付けられている WHERE コンポーネントを条件の JOIN 部分にシフトすることです。

SELECT 
      IFNULL(working_hour_special.start, working_hour.start) AS startTime,
      IFNULL(working_hour_special.end, working_hour.end) AS endTime,
      type
   FROM 
      working_hour_special 
         LEFT JOIN working_hour 
            ON working_hour.employee_id = working_hour_special.employee_id
           AND working_hour_special.start = DATE('2013-03-13')
   WHERE 
          employee_id = 1 
      AND working_hour.weekDay = DAYOFWEEK('2013-03-13')
于 2013-03-13T08:36:43.390 に答える