2010-08-12 4 views
1

다음 표에는 이동 테이블의 이동을 나타내는 레코드가 있습니다. 시간은 자정 전에 시작하고 다음 날 끝나는SQL2008의 날짜 쿼리

ID, Description, Start Time, End Time 
1, Morning, 06:00, 13:59 
2, Afternoon, 14:00, 21:59 
3, Night, 22:00, 05:59 

는 지금은 시간이지나 관련된하지만 야간 근무에 대한 기록을 점점 붙어 얻을 변화를 얻을 수 있어야합니다.

전달 된 시간을 기준으로 올바른 이동을 얻으려면이 테이블을 쿼리하는 가장 쉬운 방법은 무엇입니까?

TIA - 당신이 날짜 시간을 사용하는 경우 마이크

+0

'경과 시간'은 어떻게 생겼습니까? 이런 시작/끝 시간입니까? 단일 날짜/시간? – Fosco

답변

1

는 SQL 2008 시간 유형이 약간 정보를 개선시킬 수있는 결과를 처리 할 수도 있지만 이것을 시도하십시오 :

--Your Shift data as a temp table 
declare @shifts table (ID int, Description varchar(10), [Start Time] smalldatetime, [End Time] smalldatetime) 
insert into @shifts (ID, Description, [Start Time], [End Time]) 
select 1, 'Morning', '06:00', '13:59' 
union all 
select 2, 'Afternoon', '14:00', '21:59' 
union all 
select 3, 'Night', '22:00', '05:59' 

-- Time to check 
declare @timeToCheck smalldatetime 
SET @timeToCheck='04:00' 

-- The query to find the matching shift 
select * from @shifts where 
([Start Time]<[End Time] AND @timeToCheck>=[Start Time] AND @timeToCheck<=[End Time]) OR 
([Start Time]>[End Time] AND (@timeToCheck>=[Start Time] OR @timeToCheck<=[End Time])) 

변경하려면 @timeToCheck를 변경하십시오.

+0

이것은 나를 위해 일했다. 대답과 다른 제안을 해주신 Elliveny에게 감사드립니다. –

0

,이 날짜를 포함 할 것입니다, 당신은 전체 날짜를 조회하고 쉽게

0

종료 시간을 저장할 필요가 없어야합니다. 다음 시작 시간이 암시합니다. 쉬워지면 교대 근무와 일대 다 관계가있는 근무 시간대가있는 두 번째 표를 가질 수 있습니다.

두 번째 테이블에서 0 -> 5:59 범위의 시프트 3이있는 네 번째 행을 추가하십시오. 그래서 표는 표 2는 다음과 같이 4를 가지고, 3 행이 있습니다

shiftID shiftTime 
3  00:00 
1  06:00 
2  14:00 
3  22:00 

당신이 원한다면, 당신은 시간 0시 또 다른 시간을 06, 14 isShiftStart 진정한 표시된라는 이름의 열 및 22과 거짓을 추가 할 수 있습니다

+0

전형적으로 이것은 제가하는 방법입니다. 내 의뢰인이 이전 계약자를 해임했을 때이 프로젝트를 계승 했으므로 그대로 유지해야합니다. 당신은 설치의이 종류에 100 % 정확하다 그러나. –