【问题标题】:Work out the amount of hours in last week计算上周的小时数
【发布时间】:2018-11-15 00:14:14
【问题描述】:

我目前有一个时钟日志表,其中引用了另外两个表。它引用的一个表包含一个打卡记录,另一个包含一个打卡记录:每个表都有一个唯一的 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_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

【问题讨论】:

标签: php mysql sql mysqli pdo


【解决方案1】:

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

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

Live fiddle

【讨论】:

  • 非常感谢!我想我在尝试构建子查询时感到困惑。 +1 的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2016-03-08
  • 1970-01-01
相关资源
最近更新 更多