教你轻松学会SQLServer记录轮班的技巧

教你轻松学会SQLServer记录轮班的技巧,第1张

教你轻松学会SQLServer记录轮班的技巧,第2张

例:公司员工采用三班制:第一班从早上0点到8点,第二班从早上8点到下午4点,第三班从下午4点到12点。员工使用电子钟签名,可以自动将记录添加到SQL Server数据库中。但是,有时候,需要加夜班;即使这个班次发生在第二天,仍然会被认为是第三个班次。

你不妨将记录按班次分组,但你的计划中会出现两个非常头疼的问题:
(1)并非所有员工都按时到岗;
(2)有时员工的工作时间比他们的一个班次还要长。

为了在列表中得到正确的分组,您必须假设所有员工都可以在轮班开始和结束之间的任何时间开始工作。

使用CASE语句是一种解决方案。清单A中的SQL语句告诉我们当创建测试表时没有错误时它是如何工作的。

为了让程序代码完整准确的运行,你需要得到时间小窗口内每一个班次的开始时间和下一个班次的结束时间。在刚才的例子中,可以使用值‘15:59:59.123’代替@StartTime,然后重新运行代码。此时,您必须在每个班次结束时的分界点上加上999毫秒。

解决方案
这个例子假设班次时间从来没有改变过,但是如果班次时间改变了呢?你必须模仿这个例子,根据改变的时间写所有的代码。

一个更好的主意是为我们的班次创建一个表,以调用班次的开始时间和结束时间。在该表中,可以修改Case语句来查找StopTime列。

清单B包含创建班次表并向其中添加记录的代码。在代码设置了班次中的时间之后,这使得代码看起来简单而灵活:

DECLARE @ start time VARCHAR(20)
SET @ start time = ' 22:59:59 '
SELECT 1 shift name FROM shift work。轮班
在哪里轮班。开始时间订单按开始时间DESC

我之所以要对班次记录进行降序排列,是为了避免第三个班次的边界问题。我将用一些测试案例来展示我的结论,您可以在清单c中看到。

事实上,您可以将这个逻辑应用于TemeCards表的记录,而无需创建另一个表并向其中添加数据。我还使用一个简单的变量来演示我的逻辑。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 教你轻松学会SQLServer记录轮班的技巧

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情