2010-08-12 84 views
1

我有以下記錄描述了Shifts表中的班次。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 2010-08-12 12:54:43

回答

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提供的答案和所有其他人提供的建議:) – 2010-08-19 06:51:47

0

如果您使用的日期時間,它將包括日期,然後你可以查詢整個datetime和輕鬆處理結果

0

你不需要存儲結束時間,它暗示下一個開始時間。 如果它變得更容易,您可以使用換檔時間範圍與換檔的一對多關係的第二張表。

在第二個表中,添加第四行,其中shift 3的範圍是0 - > 5:59。 所以table1中有3行, 表2有4個這樣的:

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

,如果你願意,你可以添加一個名爲isShiftStart標誌着真正爲06倍,14 22另一列,並且,假時間00:00

+0

Typcially這是我會這樣做的方式。當我的客戶解僱了他之前的承包商時,我繼承了這個項目,所以不得不繼續這個項目。儘管你在這種設置上是100%正確的。 – 2010-08-19 06:19:08