Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нахождение времени между датами / 5 сообщений из 5, страница 1 из 1
18.09.2019, 00:18
    #39863121
UniBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нахождение времени между датами
Приветствую всех!
Есть такая проблема, необходимо сделать запрос, который бы считал время (в часах) пребывания на территории каждого человека, между каждым входом и выходом за определённые даты (например за месяц). При этом даты записываются в одно поле, а определяется что это - вход или выход в другом.
Пример таблицыEmployeIDDateTimeMessage1112019-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 272222019-09-05 12:00:00 523332019-09-06 15:30:00 null1112019-09-07 16:00:00 16


Как такое возможно реализовать?
...
Рейтинг: 0 / 0
18.09.2019, 01:40
    #39863124
3unknown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нахождение времени между датами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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
...
Рейтинг: 0 / 0
18.09.2019, 06:14
    #39863131
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нахождение времени между датами
3unknown[src]
declare @t table (EmployeID int, DT DateTime,MS varchar(10))


Самое веселое в этом начинается, если система сбойнет (незапишет) на входе или выходе...
...
Рейтинг: 0 / 0
18.09.2019, 07:52
    #39863137
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нахождение времени между датами
Код: sql
1.
2.
3.
4.
5.
6.
7.
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 .
...
Рейтинг: 0 / 0
18.09.2019, 14:34
    #39863336
UniBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нахождение времени между датами
Akina , 3unknown большое спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нахождение времени между датами / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]