首页 > 解决方案 > 计算上周的小时数

问题描述

我目前有一个时钟日志表,它引用了另外两个表。它引用的一个表包含一个打卡日志,另一个包含一个打卡记录:每个表都有一个唯一的 ID。

例如(对于每个rwh_clock_inrwh_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_outatTime在上周二和下周二之间。

我也试过:

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

标签: phpmysqlsqlmysqlipdo

解决方案


您不需要所有这些 CASE 表达式和子查询。使用两个连接(使用三个命名参数userid和):timeintimeout

SELECT c.*
FROM
    rwh_clocking AS c
INNER JOIN rwh_clock_in AS ci
    ON c.clockInId = ci.id AND ci.userid = :userid
INNER JOIN rwh_clock_out AS co
    ON c.clockOutId = co.id AND co.userid = :userid
WHERE ci.atTime > :timein AND co.atTime < :timeout

现场小提琴


推荐阅读