0

異なるシフトと平日で働く従業員がいます。シフトの詳細は、workshifts テーブルに次の形式で保存されます。

  1. 平日 - 月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日
  2. StartTime - 24 時間形式。例: 05:00
  3. EndTime - 24 時間形式。例:18:00

一部の従業員は夜勤で働いています。したがって、開始時間は 20:00 で、終了時間は 05:00 (翌日の朝) になります。夜勤の従業員の場合、WeekDay は Starttime 平日になります。

従業員にオンライン/現在働いていることを示す必要があります。これはリアルタイムのデータです。現在、現在の日付のレコードを抽出してから、現在の時刻が開始時刻と終了時刻の範囲内にあるかどうかを検証する Java を使用しています。はいの場合、レコードが表示されます。それ以外の場合は無視されます。

従業員の増加により、このプロセス全体に時間がかかりすぎています。

SQLを使用して直接このチェックを行いたいと思います。StartTime および Endtime フィールドは varchar(10) であり、常に HH:MM の形式になります

これを SQL 内で直接行うことは可能ですか?

4

1 に答える 1

2

日付/時刻形式を使用して実際の時刻を保存すると、非常に簡単になります。ただし、データの形式を考えると、明示的なロジックを使用して、現在誰がシフトにいるかを把握できます。

select ws.*
from workshifts ws
where (ws.StartTime < ws.EndTime and
       date_format(now(), '%h:%i') >= ws.StartTime and 
       date_format(now(), '%h:%i') <= ws.EndTime and
       date_format(now(), '%W') = ws.Weekday
      ) or 
      (ws.StartTime > ws.EndTime and
       ((date_format(now(), '%h:%i') >= ws.StartTime and 
         date_format(now(), '%W') = ws.Weekday
        ) or
        (date_format(now(), '%h:%i') <= ws.EndTime and
         date_format(date_sub(now(), interval 1 day), '%W') = ws.Weekday
        )
       )
      );
于 2015-05-22T11:09:40.743 に答える