SQL 2008中的日期查询

时间:2010-08-12 12:51:27

标签: tsql sql-server-2008

我有以下记录描述了Shifts表中的变化。

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 - 迈克

3 个答案:

答案 0 :(得分: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以进行测试。

答案 1 :(得分:0)

如果您使用了Datetime,它将包含日期,您可以查询整个日期时间并轻松处理结果

答案 2 :(得分:0)

您不需要存储结束时间,这是在下一个开始时间隐含的。 如果它更容易,你可以有一个第二个表,其中班次时间范围与班次之间存在一对多的关系。

在第二个表格中,添加第4行,其中第3行的范围为0 - > 5:59。 所以table1有3行, table2有4个像这样:

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

如果需要,可以为时间06,14和22添加另一个名为isShiftStart的列标记为true,为时间00:00添加false