首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL2008中的日期查询

SQL2008中的日期查询
EN

Stack Overflow用户
提问于 2010-08-12 20:51:27
回答 3查看 157关注 0票数 1

我在班次表中有以下描述班次的记录。

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-12 21:12:26

SQL 2008时间类型可能会略微改善它,但请尝试如下所示:

代码语言:javascript
运行
复制
--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
EN

Stack Overflow用户

发布于 2010-08-12 20:57:13

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

票数 0
EN

Stack Overflow用户

发布于 2010-08-12 23:19:46

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

在第二个表中,添加移位为3的第四行,范围为0 -> 5:59。所以table1有3行,table2有4行,如下所示:

代码语言:javascript
运行
复制
shiftID shiftTime 
3       00:00 
1       06:00 
2       14:00 
3       22:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3467804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档