If statement 如何通过c或SQL代码检查SQL Server表中以前的所有值

If statement 如何通过c或SQL代码检查SQL Server表中以前的所有值,if-statement,time,sql-server-2008-r2,If Statement,Time,Sql Server 2008 R2,我有一张记录员工进出时间的表格。 我的桌子: CREATE TABLE [dbo].[tbl_attendanceSheet] ( [Id] INT IDENTITY (1, 1) NOT NULL, [memberCode] NVARCHAR (20) NULL, [name] NVARCHAR (20) NULL, [date] date NULL, [clockin]

我有一张记录员工进出时间的表格。 我的桌子:

CREATE TABLE [dbo].[tbl_attendanceSheet] (
    [Id]           INT            IDENTITY (1, 1) NOT NULL,
    [memberCode]   NVARCHAR (20)  NULL,
    [name]         NVARCHAR (20)  NULL,
    [date]         date  NULL,
    [clockin]      time  NULL,
    [clockout]     time  NULL,
    [delay]        time  NULL,
    [HouresWorked] time  NULL,
    [desc]         NVARCHAR (150) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
我想实现这个逻辑:

IF ClockIn exists and ClockOut exists, Insert the value into ClockIn(new row).
IF ClockIn doesnt exist and ClockOut doesnt exist, Insert the value into ClockIn.
IF ClockIn exists and ClockOut doesnt exist, Insert the value into ClockOut.
我可以在不相互检查的情况下实现插入时钟输入和时钟输出,我的问题是如何检查其中一个是否存在,如果存在,则应在必要时更新另一个

我自己尝试的是:

CREATE PROCEDURE InputClock
@QmemberCode nvarchar(20),
@InputName nvarchar(20),
@InputDate Date,
@InputTime time
as

IF NOT EXISTS (SELECT TOP 1 clockin FROM tbl_attendanceSheet WHERE memberCode=@QmemberCode ORDER BY ClockIn DESC) AND NOT EXISTS (SELECT TOP 1 clockout FROM tbl_attendanceSheet WHERE memberCode=@QmemberCode ORDER BY ClockOut DESC)
BEGIN
   Insert Into tbl_attendanceSheet(memberCode,name,date,clockIn) Values (@QmemberCode,@InputName,@InputDate,@InputTime)
END
ELSE IF EXISTS (SELECT TOP 1 clockin FROM tbl_attendanceSheet WHERE memberCode=@QmemberCode ORDER BY ClockIn DESC) AND NOT EXISTS (SELECT TOP 1 clockout FROM tbl_attendanceSheet WHERE memberCode=@QmemberCode ORDER BY ClockOut DESC)
BEGIN
    Insert Into tbl_attendanceSheet(memberCode,name,date,clockout) Values (@QmemberCode,@InputName,@InputDate,@InputTime)
END
它不起作用,因为当clockIn列有一个值和clockOut时 列doesnt未在“时钟输出”列中输入时间值

为什么我需要这种逻辑?因为有几位员工会以任何顺序在早上打卡,而不会以相同的顺序在晚上打卡。因此,系统应该找出谁以前打卡过,谁打卡过,谁以前没做过什么,谁打卡过

我希望以另一种方式呈现的内容: 假设这是我的桌子:

[memberCode] | [name] | [ClockIn]| [ClockOut]
早上亚历克斯来了,打卡上班

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          jamy     09:00:20
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          alex     09:00:00  
    122          jamy     09:00:20
    123          Neo      09:00:25
杰米来了,开始打卡

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          jamy     09:00:20
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          alex     09:00:00  
    122          jamy     09:00:20
    123          Neo      09:00:25
尼欧来了,打卡上班

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          jamy     09:00:20
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          alex     09:00:00  
    122          jamy     09:00:20
    123          Neo      09:00:25
Neo离开:

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          alex     09:00:00  
    122          jamy     09:00:20
    123          Neo      09:00:25   13:00:00
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          Jamy     09:00:20   22:00:00
    123          Neo      09:00:25   13:00:00
    123          Neo      18:00:00   23:00:00
尼欧来了

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          Jamy     09:00:20
    123          Neo      09:00:25   13:00:00
    123          Neo      18:00:00    
晚上,杰米离开:

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          Jamy     09:00:20   22:00:00
    123          Neo      09:00:25   13:00:00
    123          Neo      18:00:00 
Neo离开:

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          alex     09:00:00  
    122          jamy     09:00:20
    123          Neo      09:00:25   13:00:00
[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00  
    122          Jamy     09:00:20   22:00:00
    123          Neo      09:00:25   13:00:00
    123          Neo      18:00:00   23:00:00
亚历克斯离开:

[memberCode] | [name] | [ClockIn]| [ClockOut]
    121          Alex     09:00:00   00:00:00
    122          Jamy     09:00:20   22:00:00
    123          Neo      09:00:25   13:00:00
    123          Neo      18:00:00   23:00:00
当然,我也需要一个日期列,但由于简单,我省略了它。
这是我制作考勤表的想法。如果您想添加一些内容使其更好,我将不胜感激。

我建议的解决方案是首先尝试更新,然后,如果更新没有影响任何记录,请插入新记录。 我假设发送到存储过程的数据只与使用@InputDate参数发送的日期相关

以下是我建议的程序:

CREATE PROCEDURE InputClock
    @QmemberCode nvarchar(20),
    @InputName nvarchar(20),
    @InputDate Date,
    @InputTime time
AS

UPDATE [dbo].[tbl_attendanceSheet]
SET [clockout] = @InputTime
WHERE memberCode = @QmemberCode
AND [date] = @InputDate
AND [clockin] IS NOT NULL
AND [clockout] IS NULL

IF @@ROWCOUNT = 0 
BEGIN

    INSERT INTO tbl_attendanceSheet(memberCode,name,date,clockIn)
    VALUES (@QmemberCode,  @InputName, @InputDate, @InputTime)

END

要了解更多信息,请阅读Aaron Bertrand对

的回答,如果时钟输入和时钟输出都已设置,会发生什么情况?@KlausGütter它应该以该名称开始新的一行,并在时钟输入列中记录时间。您能告诉我们您已经尝试了什么以及您遇到了什么问题吗?我会用SQL完成整个过程,这很容易——逻辑是要么更新该员工的现有记录,要么创建一个新记录。然而,你应该考虑到当一个员工打卡上班,忘记打卡下班,然后第二天再打卡上班时会发生什么。如果你有夜班,这会变得更难。不过,这可以使用单个存储过程解决。请从表中选择TOP 1*,其中EmployeeID=@id ORDER BY ClockIn DESC将返回最新的记录,如果这是该员工的第一个时钟,则不会返回任何记录。请给我一些时间研究您的答案,谢谢您的回答。