Определите количество часов на прошлой неделе - PullRequest
0 голосов
/ 05 июня 2018

В настоящее время у меня есть таблица журналов синхронизации, которая ссылается на две другие таблицы.Одна таблица, на которую он ссылается, содержит журнал учета, а другая - запись учета: каждая имеет уникальный идентификатор.

Например (для каждой таблицы 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

1 Ответ

0 голосов
/ 05 июня 2018

Вам не нужны все эти выражения 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

Живая скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...