我在班次表中有以下描述班次的记录。
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 - Mike
发布于 2010-08-12 21:12:26
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以测试它。
发布于 2010-08-12 20:57:13
如果您使用Datetime,它将包含日期,然后您可以查询整个datetime并轻松处理结果
发布于 2010-08-12 23:19:46
您不需要存储结束时间,它隐含在下一个开始时间中。如果这样做更容易,您可以使用第二个表,其中包含与班次具有一对多关系的班次时间范围。
在第二个表中,添加移位为3的第四行,范围为0 -> 5:59。所以table1有3行,table2有4行,如下所示:
shiftID shiftTime
3 00:00
1 06:00
2 14:00
3 22:00如果需要,可以添加另一个名为isShiftStart的列,将时间06、14和22标记为true,将时间00:00标记为false
https://stackoverflow.com/questions/3467804
复制相似问题