我试图根据两个单独的表中两次是否在给定半径内来从表中选择行。
到目前为止,我的应用程序将检入和退出用户。当用户签出时,它会在rwh_checking
表格中创建一个包含rwh_check_in
ID和rwh_check_out
ID的日志,然后计算每次之间的小时数。
如果用户的入住时间是0800时,用户退房时间是0900时,服务器时间是1000,半径是现在和2小时之间的任何时间,那么应该显示日志。如果他们多次签入和签出,则应显示这两个时间戳之间的所有日志。
这是我的表格布局:
用于存储已验证和计算的日志的表:
CREATE TABLE rwh_clocking (
id INT (255) AUTO_INCREMENT PRIMARY,
clockInId INT (255),
clockOutId INT (255),
hours DECIMAL (24,2)
);
用于存储时钟的雇主的表:
CREATE TABLE rwh_clock_in (
id INT (255) AUTO_INCREMENT PRIMARY,
atTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
userid INT (255)
);
存储已淘汰的雇主的表:
CREATE TABLE rwh_clock_in (
id INT (255) AUTO_INCREMENT PRIMARY,
atTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
userid INT (255)
reason VARCHAR (1024)
);
我试图计算一个雇主在给定开始日期和给定结束日期的一周内完成的小时数。目前,每周(周二至周二)设定。每个时钟输入和输出都需要进行检查以确定它们是否符合此时间范围,如果他们这样做,我想为每个时钟提取clockInId
,clockOutId
和hours
到目前为止,我已经尝试了这一点(过去2小时内任何时钟输入和输出,在我的测试数据中,2位用户都做了一个小时):
SELECT c.clockInId, c.clockOutId, c.hours
FROM rwh_clocking c,
( SELECT 1 as 'id',
( SELECT atTime FROM rwh_clock_in WHERE atTime > NOW() - INTERVAL 120 MINUTE AND userid = id ) AS 'ci',
( SELECT atTime FROM rwh_clock_out WHERE atTime < NOW() AND userid = id ) AS 'co' ) cio;
但是这个查询似乎带出了所有信息,而不是atTime
是否在半径范围内。
我也试过
SELECT c.clockInId, c.clockOutId, c.hours
FROM rwh_clocking c,
( SELECT 2 as 'id',
( SELECT id FROM rwh_clock_in WHERE atTime > NOW() - INTERVAL 120 MINUTE AND userid = id ) AS 'ci',
( SELECT id FROM rwh_clock_out WHERE atTime < NOW() + INTERVAL 5 MINUTE AND userid = id ) AS 'co' ) cio
WHERE c.clockInId = cio.ci AND c.clockOutId = cio.co
但它现在没有记录。
检查用户是否已启动或已启动的我的SQL查询是:
SELECT cie.forename,
cie.surname,
cie.payrefno,
cie.contactnumber,
cie.contactemail,
cie.uniquecode,
cio.*,
( CASE WHEN last_ci < last_co THEN 0 ELSE 1 END ) AS 'which'
FROM (SELECT ? AS userid,
(SELECT Max(attime) FROM rwh_clock_in WHERE userid = ?) AS last_ci,
(SELECT Max(attime) FROM rwh_clock_out WHERE userid = ?) AS last_co) cio
INNER JOIN rwh_employers cie
ON cie.id = cio.userid