0

我使用 h2 数据库。我有 3 个表:USER、SCHEDULEWORKER 和 SECURITYACCESS。

用户

userNumber, firstName, lastName

调度员

USERNUMBER, STARTDATE, ENDDATE  

安全访问

USERNUMBER, DATEACCESS, DOOR

STARTDATE, ENDDATE and DATEACCESS使用时间戳datatype

我想了解所有想工作一天并且在开始日期之后进入大门的用户。

所以对于这个例子

SCHEDULEWORKER  
USERNUMBER      STARTDATE               ENDDATE  
4141            2012-07-02 07:30:00.0   2012-07-02 16:30:00.0
4123            2012-07-02 07:30:00.0   2012-07-02 16:30:00.0

SECURITYACCESS
USERNUMBER      DATEACCESS      DOOR  
4145    2012-07-02 07:31:56.0   MainDoor
4123    2012-07-02 07:29:56.0   MainDoor

我想拥有

USERNUMBER  STARTDATE              ENDDATE                DATEACCESS        DOOR        late
4141    2012-07-02 07:30:00.0  2012-07-02 16:30:00.0  2012-07-02 07:31:56.0 MainDoor    00:01:56

我是否需要拆分我的字段时间戳才能执行此查询?

4

1 回答 1

2

这会很慢,但如果您一天中有很多 SECURITYACESS,您必须比较当天的首次访问。我不使用 h2,因此您必须管理后期列的时间戳计算

select SW.USERNUMBER, STARTDATE, ENDDATE, DATEACCESS, DOOR, (h2 calculations on timestamps) as late
FROM SCHEDULEWORKER AS SW 
  inner join SECURITYACCESS AS SA on SW.USERNUMBER=SA.USERNUMBER
  inner join (SELECT USERNUMBER, MIN(DATEACCESS) as ACCESS
              FROM SECURITYACCESS 
              GROUP BY USERNUMBER, YEAR(DATEACCESS), DAY_OF_YEAR(DATEACCESS)) AS MSA ON SW.USERNUMBER = MSA.USERNUMBER AND MSA.ACCESS = SA.DATEACCESS
WHERE SW.STARTDATE < MSA.ACCESS

如果您有更多 where 条件:可能是日期范围或用户编号作为参数,您应该更改 MSA 查询以获得更好的性能。

我没有找到时间戳到日期的转换或更好的 group by 子句的功能。

于 2012-11-09T15:04:26.847 回答