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

 更新时间:2013年11月24日 17:37:08   作者:  
员工使用电子时钟进行签名,这种电子签名可以自动将记录添加到SQL Server数据库中。但是,有时候,需要增加一个夜班;即使这个轮班发生在第二天,它仍然会被认为是第三班

例:公司员工采取三个轮班制度:凌晨0:00到早上8:00为第一班,早上8:00到下午4:00为第二班,下午4:00到晚上12:00为第三班。

员工使用电子时钟进行签名,这种电子签名可以自动将记录添加到SQL Server数据库中。但是,有时候,需要增加一个夜班;即使这个轮班发生在第二天,它仍然会被认为是第三班。

你也许希望根据轮班对记录进行分组,但是在你的计划中会有两个非常令人头痛的问题:
(1)不是所有的雇员都是按时到达的;
(2)有时候员工工作的时间会比他们的一个轮班的时间长一些。

为了能在你的列表中得到正确的分组,你必须假设所有的员工能在一个轮班的开始和结束时间之间的任意时间开始工作。

使用CASE语句是一种解决办法。Listing A中的SQL语句告诉我们,在创建测试表没有错误的情况下,它是如何工作的。

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

解决方案

这个例子假设轮班时间从来没有改变过,但是如果改变了轮班时间该怎么办呢?你必须仿照这个例子并根据改变了的时间写出所有的代码。

一个更好一点的主意就是,针对我们的轮班创建一个表来调用Shifts的开始时间和结束时间。在这个表中,你可以修改Case语句来查找StopTime列。

Listing B中包含了创建Shifts表并向该表中增加记录的代码。代码在一个轮班中设置了时间后,这样使代码看上去既简单又灵活:

复制代码 代码如下:

DECLARE @StartTime VARCHAR(20)
SET @StartTime ="22:59:59"
SELECTTOP 1 ShiftName FROM ShiftWork.Shifts
WHERE Shifts.StartTime <= @StartTime
ORDERBY StartTime DESC


我之所以要将轮班记录进行降序排列,是为了避免第三个轮班的边界问题。我将用一些测试案例来论证我的结论,这些内容你可以在Listing C中看到。

实际上,你可以将这个逻辑应用到TemeCards表的记录中去,而不需要创建另外的表,也就不需要在表中增加数据了。我同样使用一个简单的变量来论证我的逻辑。

相关文章

  • SQL server插入报错:当 IDENTITY_INSERT 设置为 OFF 时不能为表 ‘XXX‘ 中的标识列插入显式值的问题解决

    SQL server插入报错:当 IDENTITY_INSERT 设置为 OFF 时不能为表 ‘XXX‘ 

    这篇文章主要介绍了SQL server插入报错:当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘XXX‘ 中的标识列插入显式值的问题,该问题是给SQL server数据库中的某个表插入数据引起的报错,一般出现在该表为自增的情况下,本文给大家分享解决方法,需要的朋友可以参考下
    2023-09-09
  • 我也有微信朋友圈了 Android实现

    我也有微信朋友圈了 Android实现

    最近写了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照或者从相册选取,从相册选取可以一次选择多张照片,并且限制照片的张数,想拥有真正属于自己的朋友圈吗?快来围观
    2016-05-05
  • 深入分析SQL Server 存储过程

    深入分析SQL Server 存储过程

    本文给大家详细介绍了sqlserver的存储过程,包括存储过程的概念、优缺点、系统存储过程、用户自定义存储过程等方面的内容了,有需要的小伙伴可以参考下。
    2015-06-06
  • SQLSERVER分布式事务使用实例

    SQLSERVER分布式事务使用实例

    这篇文章主要介绍了如何使用SQLSERVER分布式事务的方法,大家参考使用吧
    2013-11-11
  • CPU 核心数超过 Enterprise Server/CAL 限制问题的解决方法

    CPU 核心数超过 Enterprise Server/CAL 限制问题的解决方法

    最近有客户要求安装sql server 2019 数据库,安装过程中提示Enterprise Server/CAL CPU 核心利用率限制规则生成了警告,CPU 核心数超过 Enterprise Server/CAL 限制,20 个物理核心,或已启用超线程的 40 个逻辑核心,原来企业版也是有区别的
    2024-04-04
  • SQL Server表分区删除详情

    SQL Server表分区删除详情

    这篇文章主要介绍了SQL Server表分区删除,删除分区又称为合并分区,简单地讲就是将多个分区的数据进行合并。现以表Sales.SalesOrderHeader作为示例,演示如何进行表分区删除。下面就和小编一起进入文章学习该内容吧
    2021-10-10
  • 数据库清除日志文件(LDF文件过大)

    数据库清除日志文件(LDF文件过大)

    数据库清除日志文件,(LDF文件过大),一般情况下,有更简单的方法,需要在sqlserver查询执行。
    2009-11-11
  • SQL Server实现将特定字符串拆分并进行插入操作的方法

    SQL Server实现将特定字符串拆分并进行插入操作的方法

    这篇文章主要介绍了SQL Server实现将特定字符串拆分并进行插入操作的方法,涉及SQL Server的循环、遍历、判定及插入等相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • MSSQL内外连接(INNER JOIN)语句详解

    MSSQL内外连接(INNER JOIN)语句详解

    这几天重新温习了一下SQL的书本,现在的思路应该是很清楚了,现在把自己的理解发出来给大家温习下。希望和我一样对SQL的连接语句不太理解的朋友能够有所帮助
    2006-11-11
  • 简单触发器的使用 献给SQL初学者

    简单触发器的使用 献给SQL初学者

    简单触发器的使用 献给SQL初学者,使用sqlserver的朋友可以参考下。
    2011-09-09

最新评论