Всем привет!
Есть таблица регистрации входов/выходов с полями id_card и daterecord TimeStamp. Как написать запрос, выбирающий пришедших после 8:00? Мое решение для одного дня:
select id_card,min(daterecord) from accesslog
where date(daterecord)='2007-10-23' and time(daterecord)>='08:00:00' and time (daterecord)<='23:59:59'
and id_card not in
(select id_card from accesslog
where date(daterecord)='2007-10-23' and time(daterecord)>='00:00:00' and time (daterecord)<'07:59:59')
group by id_card
order by daterecord
Помогите написать запрос, выбирающий опоздавших за период, например, неделю? Может и мой запрос можно как-то написать по другому?
Заранее спасибо!
Не совсем понятно зачем вторая часть запроса если первый where уже выбирает нужное. А вообще удобней использовать between
select id_card,min(daterecord) from accesslog
where
(date(daterecord) between '2007-10-23' and '2007-10-30')
and
(time(daterecord) between '08:00:00' and '23:59:59')
>Не совсем понятно зачем вторая часть запроса если первый where уже выбирает
>нужное.Вторая часть запроса отсеивает тех, кто пришел до восьми, потом вышел и еще раз вошел позднее. Именно в этом и проблема.
select s1.card_id, s1.data, s1.begin_time, s2.end_time from
(select id_card id_card, date(daterecord) data, min (time(daterecord)) begin_time
from accesslog group by id_card, date(daterecord)) s1,
(select id_card id_card, date(daterecord) data, max (time(daterecord)) end_time
from accesslog group by id_card, date(daterecord)) s2 where s1.id_card=s2.id_card and s1.data=s2.data
Выборка по всем датам, сотрудникам, когда пришёл - когда ушёл. Из неё уже можете выбирать по другим условиям. Может ошибся, не проверял, не пинайте, Удачи
PS s1 и s2 можно сразу суэить до интересующего диапазона дат.
Все работает! Большое спасибо!!!