我使用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
我是否需要拆分字段时间戳才能进行此查询?
答案 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子句。