【问题标题】:Date Range Not between a specific date SQL Server日期范围 不在特定日期之间 SQL Server
【发布时间】:2013-11-25 12:27:32
【问题描述】:

我有一个应用程序,当一个人进入办公室时,他必须打卡,当他离开办公室时,他必须打卡。那是考勤系统。

现在我想使用在特定日期不存在的 SQL 查询进行检查。

表格如下:-

应该通过什么查询来选择在特定日期缺席的personid

【问题讨论】:

  • 你有没有尝试过?当你有东西时请尝试一些东西回来,这就是这个网站的运作方式
  • 您应该更具体地定义“缺席”。一个简单的情况可能是,在特定的一天,该角色没有行。但是您可以将缺勤定义为“工作时间少于 X 小时”等
  • 有人在午夜工作吗?如果是这样,他们在哪一天被视为“在场”。
  • 如果有人两天后进出怎么办?
  • 什么情况下可以将一个人标记为缺席?例如:一个输入和输出时间为空,或一个输入和输出时间为空,或此表中没有记录?

标签: sql sql-server


【解决方案1】:
SELECT PERSONID
FROM <PERSON INFORMATION TABLE>
WHERE PERSONID NOT IN(SELECT PERSONID FROM <TIMING INFORMATION TABLE> WHERE INTIMESTAMP=<PARTICULAR DATE>)

【讨论】:

    【解决方案2】:

    您基本上希望从员工表中选择每个员工,然后排除在特定日期登录的任何人。简而言之,这会创建一个在给定日期未见过的 PersonID 列表。

    此解决方案有效,并附有示例案例:

    CREATE TABLE #temp (TimeSheetLogId INT IDENTITY(1,1), InTimeStamp DATETIME, OutTimeStamp DATETIME, PersonID INT);
    
    -- last week
    -- PersonID=1, didnt come to work last monday
    -- INSERT #temp VALUES ('2013-11-19 09:00:00.000','2013-11-19 17:00:00.000',1);
    INSERT #temp VALUES ('2013-11-20 09:00:00.000','2013-11-20 17:00:00.000',1);    
    INSERT #temp VALUES ('2013-11-21 09:00:00.000','2013-11-21 17:00:00.000',1);    
    INSERT #temp VALUES ('2013-11-22 09:00:00.000','2013-11-22 17:00:00.000',1);    
    INSERT #temp VALUES ('2013-11-23 09:00:00.000','2013-11-23 17:00:00.000',1);    
    -- 9AM-5PM shift
    INSERT #temp VALUES ('2013-11-19 09:00:00.000','2013-11-19 17:00:00.000',2);    
    INSERT #temp VALUES ('2013-11-20 09:00:00.000','2013-11-20 17:00:00.000',2);    
    INSERT #temp VALUES ('2013-11-21 09:00:00.000','2013-11-21 17:00:00.000',2);    
    INSERT #temp VALUES ('2013-11-22 09:00:00.000','2013-11-22 17:00:00.000',2);    
    INSERT #temp VALUES ('2013-11-23 09:00:00.000','2013-11-23 17:00:00.000',2);    
    -- 11PM-7AM shift
    INSERT #temp VALUES ('2013-11-18 23:00:00.000','2013-11-19 07:00:00.000',3);    
    INSERT #temp VALUES ('2013-11-19 23:00:00.000','2013-11-20 07:00:00.000',3);    
    INSERT #temp VALUES ('2013-11-20 23:00:00.000','2013-11-21 07:00:00.000',3);    
    INSERT #temp VALUES ('2013-11-21 23:00:00.000','2013-11-22 07:00:00.000',3);    
    INSERT #temp VALUES ('2013-11-22 23:00:00.000','2013-11-23 07:00:00.000',3);    
    
    -- this week
    INSERT #temp VALUES ('2013-11-25 09:00:00.000',NULL,1); 
    INSERT #temp VALUES ('2013-11-25 09:00:00.000',NULL,2); 
    INSERT #temp VALUES ('2013-11-24 23:00:00.000',NULL,3); 
    
    
    DECLARE @ExamineDate DATE = '2013-11-19'
    
    -- You want to select DISTINCT PersonID from your main STAFF table that contains all records, I did this for simplicity!
    SELECT DISTINCT(PersonID)
    FROM #temp A
    
    EXCEPT
    
    -- this query should remain as-is
    SELECT PersonID
    FROM #temp A
    WHERE   
        CAST(A.InTimeStamp AS DATE) = @ExamineDate
        OR
        CAST(A.OutTimeStamp AS DATE) = @ExamineDate
    ;
    
    DROP TABLE #temp;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多