Спасибо @ June7 за ответ на этот вопрос через комментарий.
После многократной проверки я понял, что написал неправильный запрос, особенно в этой строке:
IIf(WeekDay(DateValue(af.CHECKTIME)) <> 6 And Format(af.CHECKTIME, 'hh:nn:ss') <= '08:30:00',
1, IIf(Format(af.CHECKTIME, 'hh:nn:ss') <= '08:30:00', 1, 0)
)
Я должен отделиться ...WeekDay(DateValue(af.CHECKTIME)) <> 6...
в другую часть. Мой предыдущий запрос будет считать пятницу не пятницей, если время af.CHECKTIME больше '08: 30: 00', а день - пятница. И тогда я прыгнул бы к IIf
в ложной части, где я предполагаю работать в другой будний день.
А также я должен изменить эту строку:
...
FROM (CHECKINOUT AS af
LEFT JOIN CHECKEXACT bf ON af.USERID = bf.USERID)
...
На это:
...
FROM(
SELECT af.USERID, MIN(af.CHECKTIME) AS [Tanggal dan Waktu]
FROM CHECKINOUT AS af
WHERE af.USERID = 1040 And af.CHECKTIME Between #3/1/2020# And #3/31/2020#
GROUP BY af.USERID, DateValue(af.CHECKTIME)
UNION
SELECT bf.USERID, MIN(bf.CHECKTIME) AS [Tanggal dan Waktu]
FROM CHECKEXACT AS bf
WHERE bf.USERID = 1040 And bf.CHECKTIME Between #3/1/2020# And #3/31/2020#
GROUP BY bf.USERID, DateValue(bf.CHECKTIME)
)
...
Поскольку в предыдущем запросе From
напечатал бы всю дату / время между заданным диапазоном, а LEFT JOIN CHECKEXACT
напечатал бы данные CHECKEXACT, что только строка (09/03/2020 8:01:51
каждая проверка будет истинной, потому что меньше '08:30:00'
и, конечно, будет печатать 1
) многократно столько строк, сколько CHECKINOUT, в то время как мне нужно только проверять наличие присутствия, которое является только минимальной датой-временем каждого дня как CHECKINOUT, так и CHECKEXACT.
Так что правильный полный запрос будет выглядеть так:
SELECT USERID,
SUM(IIf(WeekDay(DateValue([Tanggal dan Waktu])) <> 6,
IIf(TimeValue([Tanggal dan Waktu]) <= TimeValue('08:30:00'),
1, 0
),
IIf(TimeValue([Tanggal dan Waktu]) <= TimeValue('08:30:00'), 1, 0)
)
)
AS [Came On Time or Early]
FROM(
SELECT af.USERID, MIN(af.CHECKTIME) AS [Tanggal dan Waktu]
FROM CHECKINOUT AS af
WHERE af.USERID = 1040 And af.CHECKTIME Between #3/1/2020# And #3/31/2020#
GROUP BY af.USERID, DateValue(af.CHECKTIME)
UNION
SELECT bf.USERID, MIN(bf.CHECKTIME) AS [Tanggal dan Waktu]
FROM CHECKEXACT AS bf
WHERE bf.USERID = 1040 And bf.CHECKTIME Between #3/1/2020# And #3/31/2020#
GROUP BY bf.USERID, DateValue(bf.CHECKTIME)
)
GROUP BY USERID
Приведенный выше запрос выведет 6
как правильную / желаемую [Came On Time or Early]
запись.