Как проверить все предыдущие значения в таблице SQL Server через c # или код SQL - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица для записи времени входа и выхода сотрудников.Моя таблица:

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В столбце не указывается значение времени в столбце clockOut.

Зачем мне нужна эта логика?Потому что есть несколько сотрудников , которые будут приходить утром в любом порядке и не выходить ночью в том же порядке.Таким образом, система должна выяснить, кто раньше синхронизировал In, чтобы синхронизировать его, а кто ничего не делал прежде, чтобы синхронизировать его.

что я хочу представить по-другому: давайте предположим, что это моя таблица:

[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  
    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
    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 

Нео Листья:

[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

Конечно, мне также нужен столбец с датой, но я его опустил из-за простоты.Это моя идея для посещаемости.Если вы хотите добавить что-то, чтобы сделать это лучше, я был бы признателен.

1 Ответ

0 голосов
/ 18 декабря 2018

Решение, которое я предлагаю, состоит в том, чтобы сначала попытаться обновить, а затем, если обновление не произвело никаких записей, вставить новую запись.
Я предполагаю, что данные, отправленные в хранимую процедуру, имеют отношение только кна дату, которая отправляется с использованием параметра @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

Для получения дополнительной информации прочитайте ответ Аарона Бертранда на Использованиеесли условие во вставке SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...