php - 计算上周的小时数
问题描述
我目前有一个时钟日志表,它引用了另外两个表。它引用的一个表包含一个打卡日志,另一个包含一个打卡记录:每个表都有一个唯一的 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_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
解决方案
您不需要所有这些 CASE 表达式和子查询。使用两个连接(使用三个命名参数userid
和):timein
timeout
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
推荐阅读
- angularjs - 从函数返回数据并将其分配给 AngularJS 中的变量
- reactjs - 在 reactjs 中以现有状态动态添加对象变量(使用功能组件)
- android - 如何处理edittext OntextChanged中的数字格式异常
- react-native - 使用 react-native-router-flux 加载应用程序后如何隐藏启动画面
- ubuntu - IRC 客户端连接到通用频道
- android - 如何让两个或多个 React Native 应用相互共享数据?
- angular - 如何在 Angular 中实现最简单的 http post 请求?
- sql - Readyroll:使用 VSTS 构建时出现错误:漂移分析:将不会应用这些更改,因为 DriftOptionBlockDataLoss=True
- javascript - 如何使复制按钮复制“不”
- c# - 花括号在 c# unity中不能正常工作