2017-04-18 8 views
0

모두 나는 저를 뒤적 거리며 많은 예제를 보았지만 아무 것도이를 해결하는 데 도움이되지 못합니다. 제가 근무하는 03:30:00에서 11:29:59와 같은 시간대가 있습니다 (예 : 근무 시간). 현재 시프트를 기반으로 마지막 시프트에 대한 데이터를 동적으로 쿼리하고 싶습니다. 예 : 현재 오전 11시 30 분부터 오후 7시 29 분 59 초 사이 인 경우 오전 3시 30 분부터 11시 30 분 사이의 마지막 교대를 원합니다.필드에서 시간 프레임을 선택하기 위해 현재 시간을 동적으로 사용하는 SQL 문 (Oracle)

이는 같을 것이다 경우 내 마음의 문 : 만약 시간 다음 .... 사이의 선택 시간 사이 ....

...와 .... 다음 선택 시간 사이 ELSEIF 시간

나는 많은 조합을 시도하고 이것을 알아낼 수 없다. 나는 CASE와 어쩌면 서브 쿼리가 필요할 것이라고 생각 하나? 아니면 DECODE가 작동할까요?

SELECT CAST(ccd.DATEc AS TIME) as time_occured, 
FROM db.datatb ccd 
WHERE ccd.DATE > SYSDATE - interval '1440' minute 
AND (
((TO_CHAR(SYSDATE, 'hh24:mi:ss')BETWEEN '03:30:00' AND '11:29:59' IN (SELECT 
ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME)NOT BETWEEN '03:30:00 
AM' AND '07:29:59 PM'))) 
OR (TO_CHAR(SYSDATE, 'hh24:mi:ss')BETWEEN '11:30:00' AND '19:29:59' IN 
(SELECT ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME) BETWEEN 
'03:30:00 AM' AND '11:29:59 AM'))) 
OR (TO_CHAR(SYSDATE, 'hh24:mi:ss')NOT BETWEEN '03:30:00' AND '19:29:59' IN 
(SELECT ccd.DATEc FROM db.datatb WHERE (CAST(ccd.DATEc AS TIME) BETWEEN 
'11:30:00 AM' AND '07:29:59 PM'))) 
) 
+0

오라클에는 'TIME' 데이터 유형이 없습니다. – MT0

+0

데이터베이스의 예제 데이터가 많은 도움이됩니다. 날짜가 너무 많습니까, 아니면 시간 만 있습니까? 겹침 교대가 발생할 가능성이 있습니까 (03:30:00 - 11:30:00 vs 07:00:00 - 15:00:00? –

+0

) 표의 데이터가 어떤 모습인지 샘플을 가지고 있습니까? – SandPiper

답변

0
SELECT * 
FROM db.datatb 
     CROSS JOIN 
     (SELECT TRUNC(SYSDATE - INTERVAL '210' MINUTE) 
       + NUMTODSINTERVAL(
        TRUNC(
        (SYSDATE - INTERVAL '210' MINUTE 
        - TRUNC(SYSDATE - INTERVAL '210' MINUTE) 
        ) * 3 
        ) * 480 
        + 210, 
        'MINUTE' 
       ) AS current_shift_start 
     FROM DUAL 
     ) css 
WHERE DATEc >= css.current_shift_start - INTERVAL '8' HOUR 
AND DATEc < css.current_shift_start; 

설명 :

어긋남은 각각 3시 반 (자정 과거 또는 2백10분)에서 시작 8시간이다; 그래서 SYSDATE - INTERVAL '210' MINUTE은 오프셋 시간을 이동 시켜서이 오프셋 이후에 하루의 1/3 인 00:00, 08:00 및 16:00에 시작합니다.

date_value - TRUNC(date_value)은 시간 구성 요소가 나타내는 일의 분수 (0과 1 사이)를 계산합니다. 따라서 TRUNC((date_value - TRUNC(date_value)) * 3)은 하루 중 첫 번째, 두 번째 또는 세 번째 8 시간 동안인지 여부에 따라 하루의 일부를 0, 1 또는 2로 매핑합니다. 480 분의 값을 곱한 다음 날짜가 원래 상쇄 된210 분을 더하고 교대가 시작되는 시작 시간이 지난 분을가집니다.

+0

위의 진술에 대한 정보를 제공 할 수 있습니까? – LKMS

+0

이것이 효과적입니다! 필요한 경우에 대비하여 약간의 설명을 듣고 싶습니다. 도와 주셔서 감사합니다 – LKMS

+0

@ LKMS 설명이 추가되었습니다. – MT0