|
■No86776 (TT_R25 さん) に返信
> ID | 社員CODE | 作業日 |開始時間|終了時間
> 1|A001 |20180301 |0100 |0800
0100 〜 0800 というデータが意味するところが
01:00:00〜08:00:59 なのか
01:00:00〜08:00:00 なのか
01:00:00〜07:59:59 なのか
いわゆる以上/超過、以下/未満の判断が曖昧ですが、
この辺は後で考えて頂くとして。
> 日付をまたいでいることもあり、方法が分かりませんでした。
開始終了いずれかが NULL となることがあるのか?
開始時間と終了時間が同一の場合に、0分扱いとするのか 24時間扱いとするのか?
そもそも48時間超過は無いのか?
…などなど、細かい仕様が曖昧だったりしますが、今回はとりあえず
「開始時間≧終了時間」なら翌日終了扱いということで考えてみました。
WITH KINTAI1 AS (
SELECT
T_KINTAI.*,
TO_DATE(作業日 || 開始時間, 'YYYYMMDDHH24MISS') AS 開始日時,
TO_DATE(作業日 || 終了時間, 'YYYYMMDDHH24MISS')
+ CASE WHEN 開始時間 >= 終了時間 THEN 1 ELSE 0 END AS 終了日時
FROM
T_KINTAI
), KINTAI2 AS (
SELECT
KINTAI1.*,
LAG (終了日時, 1, NULL) OVER (PARTITION BY 社員CODE, 作業日 ORDER BY 開始時間, 終了時間, ID) AS 直前の終了日時,
LEAD(開始日時, 1, NULL) OVER (PARTITION BY 社員CODE, 作業日 ORDER BY 開始時間, 終了時間, ID) AS 直後の開始日時
FROM
KINTAI1
) SELECT ID, 社員CODE, 作業日, 終了時間 FROM KINTAI2
WHERE 開始日時 < 直前の終了日時 OR 直後の開始日時 < 終了日時
ORDER BY ID
|