Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нахождение времени между датами  [new]
UniBlack
Member

Откуда:
Сообщений: 2
Приветствую всех!
Есть такая проблема, необходимо сделать запрос, который бы считал время (в часах) пребывания на территории каждого человека, между каждым входом и выходом за определённые даты (например за месяц). При этом даты записываются в одно поле, а определяется что это - вход или выход в другом.
+ Пример таблицы
EmployeIDDateTimeMessage
1112019-09-05 11:00:00 Вход
2222019-09-05 12:00:00 Вход
1112019-09-06 14:30:00 Выход
3332019-09-06 15:30:00 Вход
1112019-09-07 16:00:00 Вход
2222019-09-07 17:00:00 Выход
1112019-09-08 08:00:00 Выход

То есть, на выходе должно получиться что-то типо такого:
+ Пример таблицы 2

EmployeID Дата входа Время нахождения
1112019-09-05 11:00:00 27
2222019-09-05 12:00:00 52
3332019-09-06 15:30:00 null
1112019-09-07 16:00:00 16


Как такое возможно реализовать?
18 сен 19, 00:18    [21972935]     Ответить | Цитировать Сообщить модератору
 Re: Нахождение времени между датами  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @t table (EmployeID int, DT	DateTime,MS varchar(10))

insert @t
values(111,'2019-09-05 11:00:00','Enter'),
(222,'2019-09-05 12:00:00','Enter'),
(111,'2019-09-06 14:30:00',	'Exit'),
(333,'2019-09-06 15:30:00',	'Enter'),
(111,'2019-09-07 16:00:00',	'Enter'),
(222,'2019-09-07 17:00:00',	'Exit'),
(111,'2019-09-08 08:00:00',	'Exit')

;with En as(
select*
,row_number() over(partition by EmployeID order by DT) as num
from @t
where MS = 'Enter'
),
ex as(
select*
,row_number() over(partition by EmployeID order by DT) as num
from @t
where MS = 'Exit'
)
select a.EmployeID,a.DT as Enter,datediff(HH,a.DT,b.DT) Total
from En a
left join Ex b on a.EmployeID = b.EmployeID
and a.num = b.num
order by a.DT
18 сен 19, 01:40    [21972944]     Ответить | Цитировать Сообщить модератору
 Re: Нахождение времени между датами  [new]
aleks222
Member

Откуда:
Сообщений: 851
3unknown
[src]
declare @t table (EmployeID int, DT DateTime,MS varchar(10))


Самое веселое в этом начинается, если система сбойнет (незапишет) на входе или выходе...
18 сен 19, 06:14    [21972953]     Ответить | Цитировать Сообщить модератору
 Re: Нахождение времени между датами  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20203
WITH cte AS (SELECT *, 
             LEAD(DT) OVER (PARTITION BY EmployeID ORDER BY DT ASC) nextDT, 
             LEAD(MS) OVER (PARTITION BY EmployeID ORDER BY DT ASC) nextMS
             FROM source)
SELECT EmployeID, DT, DATEDIFF(minute, DT, nextDT)
FROM cte
WHERE (nextMS='Exit' OR nextMS IS NULL) AND MS='Enter'

fiddle.
18 сен 19, 07:52    [21972966]     Ответить | Цитировать Сообщить модератору
 Re: Нахождение времени между датами  [new]
UniBlack
Member

Откуда:
Сообщений: 2
Akina, 3unknown большое спасибо!
18 сен 19, 14:34    [21973266]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить