【发布时间】:2018-11-15 00:14:14
【问题描述】:
我目前有一个时钟日志表,其中引用了另外两个表。它引用的一个表包含一个打卡记录,另一个包含一个打卡记录:每个表都有一个唯一的 ID。
例如(对于每个rwh_clock_in 和rwh_clock_out 表):
id 1
atTime 2018-06-05 14:01:38
userid 1
然后在时钟日志中(rwh_clocking):
id 1
clockInId 1
clockOutId 1
hours 8
我正在尝试利用最后一个星期二 strtotime('last tuesday') 和下一个星期二 strtotime('next tuesday') 来计算雇主在那一周的工作时间。
我正在使用PDO::Prepare(),日期放在< > 期间,然后将用户ID 放在我正在为其计算最近一周的小时数的用户中。
到目前为止,我有这个:
SELECT *
FROM rwh_clocking
WHERE ( CASE WHEN cio.ci > ?
AND cio.co < ? )
FROM ( SELECT ? AS id,
( SELECT atTime FROM rwh_clock_in WHERE userid = id ) AS 'ci',
( SELECT atTime FROM rwh_clock_out WHERE userid = id ) AS 'co' ) cio;
但是,这会在CASE 中引发错误。任何帮助将不胜感激。
我想要的输出是:
id clockInId clockOutId hours
1 1 1 8
2 2 2 4
etc..
当clock_in 和clock_out atTime 在上周二和下周二之间时。
我也试过了:
SELECT clock.*, ( CASE WHEN cio.ci > ? AND cio.co < ? )
FROM rwh_clocking clock, ( SELECT ? AS 'id',
( SELECT atTime FROM rwh_clock_in WHERE userid = id ) AS 'ci',
( SELECT atTime FROM rwh_clock_out WHERE userid = id ) AS 'co' ) cio;
我收到一个 SQL 错误:子查询返回多于 1 行,当我运行这个时:
SELECT c.clockInId, c.clockOutId, c.hours, cio.*
FROM rwh_clocking c,
( SELECT 1 as 'id',
( SELECT atTime FROM rwh_clock_in WHERE atTime > NOW() ) AS 'ci',
( SELECT atTime FROM rwh_clock_out WHERE atTime < NOW() ) AS 'co' ) cio;
所以我相信我需要在执行CASE 之前循环遍历每个子查询。有什么想法吗?
更新:
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 5 MINUTE AND userid = id ) AS 'ci',
( SELECT atTime FROM rwh_clock_out WHERE atTime < NOW() AND userid = id ) AS 'co' ) cio;
现在将所有数据返回给我,但没有考虑时间。
*更新:**
现在,当它们确实存在时,这将不带回任何行。
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 60 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
【问题讨论】: