シフトテーブルは日毎に作成している
ここがすべての問題の元凶でしょう。
日毎にテーブルが増えるなんてゆうのは、アンチパターンの代表格です。
date(シフトの日付)
start(開始時刻)
end(終了時刻)
これが、間違いの元。
シフトの日付は不要
datetime型で start, datetime型で end を持っていればすむことでは?
これで、イメージできるんじゃないかと思いますが。
#データベース定義
##スタッフテーブル
sql
1CREATE TABLE `Staff` (
2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
3 `name` varchar(32) DEFAULT NULL COMMENT 'スタッフ名',
4 PRIMARY KEY (`id`)
5) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
##シフトテーブル
sql
1CREATE TABLE `Shift` (
2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
3 `staff_id` int(11) DEFAULT NULL COMMENT 'スタッフID',
4 `start` datetime DEFAULT NULL COMMENT '勤務開始日時',
5 `end` datetime DEFAULT NULL COMMENT '勤務終了日時',
6 PRIMARY KEY (`id`)
7) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id | staff_id | start | end |
---|
1 | 1 | 2017-01-01 22:00:00 | 2017-01-02 02:00:00 |
1 | 1 | 2017-01-02 22:00:00 | 2017-01-03 02:00:00 |
##予約テーブル
sql
1CREATE TABLE `Reserv` (
2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
3 `staff_id` int(11) DEFAULT NULL COMMENT 'スタッフID',
4 `start` datetime DEFAULT NULL COMMENT '開始日時',
5 `end` datetime DEFAULT NULL COMMENT '終了日時',
6 `name` varchar(32) DEFAULT NULL COMMENT '予約氏名',
7 PRIMARY KEY (`id`)
8) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id | staff_id | start | end | name |
---|
1 | 1 | 2017-01-01 23:00:00 | 2017-01-02 01:00:00 | お客さん |
#以下のコメントに対する回答
取得はそれで大丈夫ですが、表示する場合です。1日は何時から何時まで, 2日は何時から何時まで、という風に。カレンダーのように表示するのもいいですが。
表示する場合は、先ほど行ったように、同じ日にシフトが二つ表示される場合などありませんか?
登録時に1日の25時から26時(UI)で登録したのに、いざ一覧表示を見てみると2日にシフトがある。実質は変わりないのですが、使用するユーザからするとおかしな挙動になりませんか?
sql
1SELECT
2 st.name AS 'スタッフ名'
3 , DATE_FORMAT(sf.start, '%Y年%m月%d日') AS '勤務日'
4 , TIME_FORMAT(sf.start, '%H:%i') AS '勤務開始時間'
5 , IF(
6 DATEDIFF(sf.end,sf.start)>0
7 , concat(TIME_FORMAT(sf.end, '%H') + 24 * DATEDIFF(sf.end,sf.start), ':', TIME_FORMAT(sf.end, '%i'))
8 , TIME_FORMAT(sf.end, '%H:%i')
9 ) AS '勤務終了時間'
10FROM Shift sf
11INNER JOIN Staff st ON sf.staff_id = st.id
#ついでにおまけ
スタッフテーブルに「時給」を追加
sql
1CREATE TABLE `Staff` (
2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
3 `name` varchar(32) DEFAULT NULL COMMENT 'スタッフ名',
4 `salery` int(11) DEFAULT NULL COMMENT '時給',
5 PRIMARY KEY (`id`)
6) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
残業時間、深夜勤務時間を算出し、日給を計算
(多分、MySQLでしか動かないだろうけど...)
sql
1SELECT
2 st.name AS 'スタッフ名'
3 , DATE_FORMAT(sf.start, '%Y年%m月%d日') AS '勤務日'
4 , sf.start AS '勤務開始日時'
5 , sf.end AS '勤務終了日時'
6 , TIME_FORMAT(sf.start, '%H:%i') AS '勤務開始時間'
7 , IF(
8 DATEDIFF(sf.end,sf.start)>0
9 , concat(TIME_FORMAT(sf.end, '%H') + 24 * DATEDIFF(sf.end,sf.start), ':', TIME_FORMAT(sf.end, '%i'))
10 , TIME_FORMAT(sf.end, '%H:%i')
11 ) AS '勤務終了時間'
12 , @hour:=HOUR(TIMEDIFF(sf.end,sf.start)) + MINUTE(TIMEDIFF(sf.end,sf.start)) / 60 AS '勤務時間(h)'
13 , @exceed:=IF(
14 HOUR(TIMEDIFF(sf.end,sf.start)) + MINUTE(TIMEDIFF(sf.end,sf.start)) / 60 - 8 > 0
15 , HOUR(TIMEDIFF(sf.end,sf.start)) + MINUTE(TIMEDIFF(sf.end,sf.start)) / 60 - 8
16 , 0
17 ) AS '残業時間(h)'
18 , @night:=HOUR(
19 TIMEDIFF(
20 LEAST(sf.end, DATE_FORMAT(ADDDATE(DATE(sf.start), INTERVAL +1 DAY), '%Y-%m-%d 07:00:00'))
21 , GREATEST(sf.start, STR_TO_DATE(CONCAT(DATE(sf.start), '22:00:00'), '%Y-%m-%d %H:%i:%s'))
22 )
23 )
24 +
25 MINUTE(
26 TIMEDIFF(
27 LEAST(sf.end, DATE_FORMAT(ADDDATE(DATE(sf.start), INTERVAL +1 DAY), '%Y-%m-%d 07:00:00'))
28 , GREATEST(sf.start, STR_TO_DATE(CONCAT(DATE(sf.start), '22:00:00'), '%Y-%m-%d %H:%i:%s'))
29 )
30 ) AS '深夜勤務(h)'
31 , st.salery AS '時給'
32 , FLOOR(@hour * st.salery + @exceed * st.salery * 0.25 + @night * st.salery * 0.25) AS '給与'
33FROM Shift sf
34INNER JOIN Staff st ON sf.staff_id = st.id
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/17 00:54
退会済みユーザー
2016/11/17 14:59
退会済みユーザー
2016/11/17 15:01
退会済みユーザー
2016/11/17 15:09
退会済みユーザー
2016/11/17 15:10
退会済みユーザー
2016/11/17 16:39
退会済みユーザー
2016/11/17 16:40
退会済みユーザー
2016/11/17 16:41
退会済みユーザー
2016/11/17 16:49
退会済みユーザー
2016/11/17 16:53
退会済みユーザー
2016/11/17 16:56
退会済みユーザー
2016/11/17 17:01
退会済みユーザー
2016/11/17 17:16
退会済みユーザー
2016/11/17 17:19 編集
退会済みユーザー
2016/11/17 17:28
退会済みユーザー
2016/11/17 17:32 編集
退会済みユーザー
2016/11/17 17:40
退会済みユーザー
2016/11/17 17:41
退会済みユーザー
2016/11/17 17:44
退会済みユーザー
2016/11/17 17:46
退会済みユーザー
2016/11/17 17:47
退会済みユーザー
2016/11/17 17:55
退会済みユーザー
2016/11/18 04:26
退会済みユーザー
2016/11/18 04:40 編集
退会済みユーザー
2016/11/18 04:52
退会済みユーザー
2016/11/18 04:57
退会済みユーザー
2016/11/18 05:02
退会済みユーザー
2016/11/18 05:05 編集
退会済みユーザー
2016/11/18 05:10
退会済みユーザー
2016/11/18 05:20
退会済みユーザー
2016/11/18 05:21
退会済みユーザー
2016/11/18 05:21
退会済みユーザー
2016/11/18 05:25 編集
退会済みユーザー
2016/11/18 05:24
退会済みユーザー
2016/11/18 05:26
退会済みユーザー
2016/11/18 05:28
退会済みユーザー
2016/11/18 05:30