powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нахождение времени между датами
5 сообщений из 5, страница 1 из 1
Нахождение времени между датами
    #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
Нахождение времени между датами
    #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
Нахождение времени между датами
    #39863131
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3unknown[src]
declare @t table (EmployeID int, DT DateTime,MS varchar(10))


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


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