В настоящее время у меня есть таблица журналов синхронизации, которая ссылается на две другие таблицы.Одна таблица, на которую он ссылается, содержит журнал учета, а другая - запись учета: каждая имеет уникальный идентификатор.
Например (для каждой таблицы 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()
, даты помещаются в течение <
>
, а затем помещается идентификатор пользователя, для которого я рассчитываю часы в течениесамая последняя неделя для.
Пока у меня есть это:
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
находятся между последним вторником и следующим вторником.
Iтакже пытался:
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