查询选择时间戳字段

时间:2012-11-09 14:05:37

标签: sql h2

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

USER

userNumber, firstName, lastName

SCHEDULEWORKER

USERNUMBER, STARTDATE, ENDDATE  

SECURITYACCESS

USERNUMBER, DATEACCESS, DOOR

STARTDATE, ENDDATE and DATEACCESS使用时间戳datatype

我想知道所有想要在一天工作并且在开始日期后进入maindoor的用户。

所以对于这个例子

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

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

1 个答案:

答案 0 :(得分:2)

速度很慢但是如果你一天有很多安全保障,你必须比较当天的第一次访问。 我不使用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

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

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