Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.12.2009, 12:08
pakhand pakhand вне форума
Прохожий
 
Регистрация: 27.12.2009
Сообщения: 5
Репутация: 10
По умолчанию Помогите задать запрос для системы контроля доступа

Есть база данных на SQL системы контроля доступа, состоящая из двух

таблиц users (информация о работниках)
user_id
name

и таблица messagelog (информация о проходах работников)
message_id
user_id
datetime (datetime) дата и время
action_in (boolean) true = вход, false = выход

Необходимо написать запрос (если такое возможно с помощью одного запроса) в котором для определенного работника показывается на каждый день время его прихода на работу и ухода (работники также могут неограниченное кол-во раз выходить и заходить на работу в течении дня)
Дата Время входа Время выхода
01.12.2009 8:30:51 17:30:20
Ответить с цитированием
  #2  
Старый 27.12.2009, 12:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вроде так:
Код:
select datetime,action_id from messagelog m
 inner join users u on m.user_id=u.user_id
where u.name='Иванов'
order by m.datetime
Хотя, нет это несколько не по примеру.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 27.12.2009, 22:41
pakhand pakhand вне форума
Прохожий
 
Регистрация: 27.12.2009
Сообщения: 5
Репутация: 10
По умолчанию

не помогло. основной вопрос получения мин и максимального значения времени за каждый день. а за ответ по объединению таблиц спасибо
Ответить с цитированием
  #4  
Старый 27.12.2009, 23:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Придется делать через подзапросы с группировкой по пользователю и дате, выдранной из поля с датой и временем. А вообще, для простоты сделай через вью. Во вью сделай через подзапросы получение user_id, даты (без времени) и макс и мин времени из даты. А запросом сделай получение имени пользователя.

PS. вот нет бы писать дату и время в 2 разныз поля...
Ответить с цитированием
  #5  
Старый 27.12.2009, 23:45
pakhand pakhand вне форума
Прохожий
 
Регистрация: 27.12.2009
Сообщения: 5
Репутация: 10
По умолчанию

пробую подзапросом
select min(m.datetime), max(m.datetime)
from messagelog m
where user_id=3 and
CAST(FLOOR(CAST(m.datetime AS FLOAT)) AS DATETIME) IN
(select distinct CAST(FLOOR(CAST(m1.datetime AS FLOAT)) AS DATETIME)
from messagelog m1)
group by m.datetime

результата нет
Ответить с цитированием
  #6  
Старый 28.12.2009, 00:29
pakhand pakhand вне форума
Прохожий
 
Регистрация: 27.12.2009
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Во вью сделай через подзапросы
не очень понял что имелось ввиду под "вью"
Ответить с цитированием
  #7  
Старый 28.12.2009, 11:54
pakhand pakhand вне форума
Прохожий
 
Регистрация: 27.12.2009
Сообщения: 5
Репутация: 10
По умолчанию

в результате экспериментов получилось примерно так
Код:
SELECT CAST(FLOOR(CAST(m1.Date AS FLOAT)) AS DATETIME) AS Expr1, m1.date AS vhod, m3.date AS vihod, (DATEDIFF(mi, '2009-25-11 08:30:44', m1.date)) AS opozdanie, (DATEDIFF (mi,'2009-25-11 18:30:44',m3.date)) AS dosuhod
FROM         MessageLog m1 JOIN MessageLOG m3
ON CAST(FLOOR(CAST(m1.Date AS FLOAT)) AS DATETIME) = CAST(FLOOR(CAST(m3.Date AS FLOAT)) AS DATETIME)
WHERE 
m1.userid=3
AND
m3.userid=3
AND
m1.date IN (SELECT MIN(m2.Date) AS Expr2
                            FROM          MessageLog AS m2
                            WHERE     CAST(FLOOR(CAST(m1.Date AS FLOAT)) AS DATETIME) = CAST(FLOOR(CAST(m2.Date AS FLOAT)) AS DATETIME) and userid=3)
AND
m3.date IN (SELECT MAX(m4.Date) AS Expr4
                            FROM          MessageLog AS m4
                            WHERE     CAST(FLOOR(CAST(m3.Date AS FLOAT)) AS DATETIME) = CAST(FLOOR(CAST(m4.Date AS FLOAT)) AS DATETIME) and userid=3)
Admin: Пользуемся тегами!

Теперь не могу совладать с получением кол-ва часов проведенных сотрудником на работе за каждый день

Последний раз редактировалось Admin, 28.12.2009 в 15:05.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter