我想设计一个打卡时间戳

时间:2016-07-10 23:56:17

标签: sql sql-server tsql stored-procedures

我想创建一个虚拟打卡机,员工可以在其中打卡并打卡。自从我触及T-SQL以来已经有一段时间了,而且一些概念在我的记忆中迷失了方向。

我用打孔信息创建了一个表

CREATE TABLE Punchs
(
    id                  INT PRIMARY KEY NOT NULL IDENTITY,
    idEmployee          INT NOT NULL,
    punchIn             DATETIME NOT NULL,
    punchOut            DATETIME,

    FOREIGN KEY (idEmployee) REFERENCES Employees(id)
)

我将一些错误信息作为员工帐号的id的ID,idEmployee的员工帐号punchIn,以及员工为工作而打的时间{员工退出时的{1}}。

我想制作一个程序,知道它是否需要打入或打出。

我有一个规范

  • 如果这一天是新的一天,那就开始新的一击

到目前为止我有什么

punchOut

2 个答案:

答案 0 :(得分:1)

我已编辑了您的程序,请参阅有关更改的内嵌评论

$ keytool -exportcert -alias androiddebugkey -keystore ~/YOUR/PATH/TO/KEYSTORE -list -v

答案 1 :(得分:1)

这是一个使用MERGE的解决方案。检查委托人是一样的。

; 
WITH
active AS
(
    SELECT  id, e.idEmployee, punchIn
    FROM    Employee e
            LEFT JOIN Punchs p  ON  e.idEmployee    = p.idEmployee
                                AND p.punchOut      is null
    WHERE   e.idEmployee    = @idEmployee
)
MERGE   Punchs AS t
        USING   
        (
            select  id, idEmployee
            from    active

            UNION ALL

            -- this is to handle the condition "If the day is a new day, start a new punch"
            SELECT  id = NULL, idEmployee
            FROM    active
            WHERE   convert(date, punchIn)  <> convert(date, getdate())
        ) AS s
        ON  s.id        = t.id
WHEN    NOT MATCHED BY TARGET 
        THEN

        INSERT (idEmployee, punchIn) 
        VALUES (@idEmployee, getdate())

WHEN    MATCHED
        THEN

        UPDATE SET 
        punchOut        = getdate();