6

我正在做一个名为“考勤管理系统”的项目

该公司拥有自己的生物指纹扫描仪,用于检查员工的出勤情况并存储在数据库表中。

该表由 4 个字段组成(ID autonumber, EmployeeNo, CheckTime and CheckType)

Timekeeping系统存储所有员工的日志和考勤,但它没有指定checktype是“I”还是“O”。如下图所示,员工每次登录,系统都会自动存入数据库,但存为“I”,当同一员工再次登录时,又会存为“I”。

在此处输入图像描述

我的客户希望它尽可能自动化。一旦员工再次登录,他想将检查类型更改为“O”。

例如:

我是一名员工。我将在今天早上 8 点登录,然后它将存储到数据库中

今天早上 8 点,检查类型为“I”.. 因为我不知道我已经登录,所以我在早上 8:04 再次登录.. 系统再次将其存储为“I”,就像我一样我下午5点要登出,系统也记录为“我”..

我希望它能够自动更新数据库。无需用户提供任何参数。我希望它在一个存储过程中以自动化该过程。

它应该限制在同一员工内:示例:

Employee1 今天上午 8 点登录.. (checktype "I") Employee1 今天上午 11 点再次登录... (checktype "O") employee1 今天下午 12 点再次登录.. (checktype "I") employee1 今天下午 4 点再次登录(checktype “哦”)

标准应限制在员工编号内,仅限检查时间......并且还希望根据给定数据更新检查类型。

旧系统无法将登录存储为“O”,它纯粹是“I”..

这个怎么做?我需要你的投入和帮助!请?

我创建了一个存储过程,但不知道从哪里开始,而且我不知道完成该过程并使其工作..

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE AUTOMATIC_OVERRIDE
    @ID INT,
    @EMPLOYEENO NVARCHAR(20),
    @CHECKTIME DATETIME,
    @CHECKTYPE NVARCHAR(1)

AS
    SET NOCOUNT ON;
    WHILE @ID = (SELECT ID FROM CHECKTIME)

        SELECT ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
          FROM CHECKTIME
         GROUP BY ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
         ORDER BY CHECKTIME
GO

请帮我解决这个问题。谢谢。

4

3 回答 3

6

编辑:

进入PRC的解决方案:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE AutomaticOverrideByID
    @ID INT,
    @EMPLOYEENO NVARCHAR(20)

AS

    UPDATE CHECKTIME
    SET CHECKTYPE = CASE WHEN (SELECT
    COUNT(ID) AS CountOfLogin
    FROM CHECKTIME
    WHERE CHECKTIME.EMPLOYEENO = @EMPLOYEENO 
    AND CHECKTIME.CheckTime < C.CheckTime) % 2 = 1 THEN 'O' ELSE CHECKTYPE END
    FROM CHECKTIME C
    WHERE C.ID = @ID

GO

这是 Dhenn 询问的现有数据集的更新:

UPDATE CHECKTIME
SET CHECKTYPE = CASE WHEN (SELECT
COUNT(ID) AS CountOfLogin
FROM CHECKTIME
WHERE CHECKTIME.EMPLOYEENO = C.EMPLOYEENO 
AND CHECKTIME.CheckTime < C.CheckTime) % 2 = 1 THEN 'O' ELSE CHECKTYPE END
FROM CHECKTIME C

附上SQL Fiddle 。

于 2012-08-28T07:32:03.357 回答
5

试试这个选项(SQL Fiddle 代码),应该对 MS SQL Server 2000 有效。

在这里你有完整的工作代码,在 SSMS 选项卡上复制和粘贴。使用它来创建您的过程。

DECLARE @Checktime TABLE([ID] int, [EmployeeNo] NVARCHAR(5), [CheckTime] datetime, [CheckType] NVARCHAR(1));

INSERT INTO @Checktime
    ([ID], [EmployeeNo], [CheckTime], [CheckType])
VALUES
(1, '111-1', '20120826 08:00:00', 'I'),
(2, '222-2', '20120826 08:05:00', 'I'),
(3, '333-3', '20120826 08:07:00', 'I'),
(4, '444-4', '20120826 08:09:00', 'I'),
(5, '555-5', '20120826 08:10:00', 'I'),
(6, '666-6', '20120826 08:12:00', 'I'),
(591, '050-71-1', '20120703 13:06:18', 'O'),
(592, '050-71-1', '20120703 13:06:16', 'O'),
(593, '050-71-1', '20120703 12:54:01', 'O'),
(594, '050-71-1', '20120703 12:53:59', 'O'),
(617, '050-71-1', '20120703 07:53:14', 'O'),
(631, '050-71-1', '20120702 17:36:12', 'O'),
(641, '050-71-1', '20120702 12:13:50', 'O'),
(642, '050-71-1', '20120702 12:13:49', 'O'),
(646, '050-71-1', '20120702 12:00:33', 'O'),
(647, '050-71-1', '20120702 12:00:31', 'O'),
(678, '050-71-1', '20120702 08:07:50', 'O'),
(679, '050-71-1', '20120828 18:07:48', 'O');

DECLARE @Employee NVARCHAR(5)='050-71-1'

INSERT INTO @Checktime ([ID], [EmployeeNo], [CheckTime], [CheckType])
SELECT TOP 1 680 'NewId', EmployeeNo, GETDATE(),
       'NewCheck' = CASE 
           WHEN DATEDIFF(dd, CheckTime, GETDATE())>0 THEN 'I'
           WHEN CheckType = 'I' THEN 'O'
           ELSE 'O'
       END
  FROM @Checktime
 WHERE EmployeeNo = @Employee
 ORDER BY CheckTime DES

SELECT * FROM @Checktime

结果:

ID  EmployeeNo          CheckTime          CheckType
1     111-1     2012-08-26 08:00:00.000       I
2     222-2     2012-08-26 08:05:00.000       I
3     333-3     2012-08-26 08:07:00.000       I
4     444-4     2012-08-26 08:09:00.000       I
5     555-5     2012-08-26 08:10:00.000       I
6     666-6     2012-08-26 08:12:00.000       I
7     222-2     2012-08-28 09:37:41.917       O
于 2012-08-28T07:43:31.890 回答
4

我认为最好使用CheckIN&CheckOut列而不是CheckTime& CheckType

  • 如果他已经登录,请更新checkOut时间。

  • 如果他没有登录,请保存CheckIN&CheckOut时间,在这种情况下它很可能是同一时间。

没有比这更容易的了。

于 2012-09-05T05:42:49.957 回答