彼らは真夜中に開始から6時間によって相殺され、すべて8時間のシフト、あるので、あなたはにStamp
を回しますこのような開始のシフト時間:
select
stamp,
adddate(date(subdate(stamp, interval 6 hour)),
interval ((hour(subdate(stamp, interval 6 hour))
div 8) * 8) + 6 hour) as shift_start
from mytable;
これは6時間substracts、次いで膨張し、整数除算を使用して、ダウン0 1又は2のいずれかの時間を丸めもう一度それを出してください。
は、ここではいくつかのエッジケースとテストコードです:上記のクエリの
create table mytable (stamp datetime);
insert into mytable values ('2011-08-17 22:00:00'), ('2011-08-17 23:01:00'),
('2011-08-18 00:02:00'), ('2011-08-18 05:59:00'), ('2011-08-18 06:00:00'),
('2011-08-18 13:59:00'), ('2011-08-18 14:00:00'), ('2011-08-18 17:59:00');
出力:
+---------------------+---------------------+
| stamp | shift_start |
+---------------------+---------------------+
| 2011-08-17 22:00:00 | 2011-08-17 22:00:00 |
| 2011-08-17 23:01:00 | 2011-08-17 22:00:00 |
| 2011-08-18 00:02:00 | 2011-08-17 22:00:00 |
| 2011-08-18 05:59:00 | 2011-08-17 22:00:00 |
| 2011-08-18 06:00:00 | 2011-08-18 06:00:00 |
| 2011-08-18 13:59:00 | 2011-08-18 06:00:00 |
| 2011-08-18 14:00:00 | 2011-08-18 14:00:00 |
| 2011-08-18 17:59:00 | 2011-08-18 14:00:00 |
+---------------------+---------------------+
これはすばらしい解決策のように見え、私のテストデータではうまくいくように思えますし、その出力から日付とシフトを取得するのは非常に簡単です。私はそれを私のレポートに今統合するつもりです。本当にありがとう! – SilverbackNet