powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение данных по дате и ID
11 сообщений из 11, страница 1 из 1
Объединение данных по дате и ID
    #39884800
Lekime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех!
Имеется запрос к таблице Log:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH cte AS (SELECT *, 
             LEAD( [DateTime]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextDateTime, 
             LEAD([Message]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextMessage
             FROM  Log )

SELECT [EmployeeID], cast([DateTime] as date) as [Дата], [DateTime] as [Дата входа] , nextDateTime as [Дата выхода], 
CONCAT(FORMAT((DATEDIFF(MINUTE, [DateTime], nextDateTime)/60),'0#'),':',FORMAT((DATEDIFF(MINUTE, [DateTime], nextDateTime)%60),'0#')) as [Время нахождения]
FROM cte 
WHERE (nextMessage='Выход' OR nextMessage IS NULL) AND Message='Вход' AND DateTime >= '2019-08-01 00:0:00' AND DateTime <= '2019-08-31 23:59:00'



На выходе получается следующее:
EmployeeID Дата Дата входа Дата выхода Время нахождения8DB37C6A-D856-41F3-8B6F-66EA7BB66B0A 05.08.2019 05.08.2019 21:05 05.08.2019 22:14 1:098DB37C6A-D856-41F3-8B6F-66EA7BB66B0A 05.08.2019 05.08.2019 22:25 06.08.2019 11:18 12:538E2C4C84-6802-41A6-A757-6FF011317719 06.08.2019 06.08.2019 19:47 06.08.2019 20:07 0:208E2C4C84-6802-41A6-A757-6FF011317719 06.08.2019 06.08.2019 21:20 06.08.2019 22:50 1:30

Подскажите пожалуйста, как объединять время нахождения по дате и EmployeeID, чтобы на выходе получалось следующее:
EmployeeID Дата Время нахождения8DB37C6A-D856-41F3-8B6F-66EA7BB66B0A 05.08.2019 14:028E2C4C84-6802-41A6-A757-6FF011317719 06.08.2019 1:50
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39884801
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime,

вам нужно изучить функции работы со временем и группировку
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885014
Lekime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понял что, сгруппировать нужно так:
Код: sql
1.
GROUP BY [EmployeeID], cast([DateTime] as date)


Но как сложить время?
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885015
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime
Я так понял что, сгруппировать нужно так:
Код: sql
1.
GROUP BY [EmployeeID], cast([DateTime] as date)


Но как сложить время?

DATEDIFF
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885019
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime,

Код: sql
1.
2.
SUM(DATEDIFF(MINUTE, '0:00:00', [Время нахождения])),
SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime))
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885030
Lekime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть получается так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH cte AS (SELECT *, 
             LEAD( [DateTime]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextDateTime, 
             LEAD([Message]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextMessage
             FROM  Log )

SELECT [EmployeeID], cast([DateTime] as date) as [Дата],
SUM(DATEDIFF(MINUTE, '0:00:00', CONCAT(FORMAT((DATEDIFF(MINUTE, [DateTime], nextDateTime)/60),'0#'),':',FORMAT((DATEDIFF(MINUTE, [DateTime], nextDateTime)%60),'0#')))),
SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime))
FROM cte 
WHERE (nextMessage='Выход' OR nextMessage IS NULL) AND Message='Вход' AND DateTime >= '2019-08-01 00:0:00' AND DateTime <= '2019-08-31 23:59:00'

GROUP BY [EmployeeID], cast([DateTime] as date)



Пишет ошибку преобразования даты или времени из символьной строки.
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885040
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH cte AS (SELECT *, 
             LEAD( [DateTime]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextDateTime, 
             LEAD([Message]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextMessage
             FROM  Log )

SELECT [EmployeeID], cast([DateTime] as date) as [Дата],
CONCAT(FORMAT(SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime)/60),'0#'),':',FORMAT(SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime)%60),'0#')) as [Время нахождения]
FROM cte 
WHERE (nextMessage='Выход' OR nextMessage IS NULL) AND Message='Вход' AND DateTime >= '2019-08-01 00:0:00' AND DateTime <= '2019-08-31 23:59:00'

GROUP BY [EmployeeID], cast([DateTime] as date)


Не забудьте что для последнего входа за день у вас nextDateTime = NULL.
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885064
Lekime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Remind,
Спасибо большое, но проблема возникла в следующем, теперь минуты складываются отдельно и часы отдельно.
Я так понимаю, что изначально лучше всё считать в минутах
Код: sql
1.
SUM(DATEDIFF(minute, [DateTime], nextDateTime)) as [Время нахождения]

Но, как потом итоговый результат преобразовать в часы с минутами?
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885086
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime,

Поделить на 60?
И посмотреть в справке насчет операции %
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885087
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lekime,

Правильно расставить скобки :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH cte AS (SELECT *, 
             LEAD( [DateTime]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextDateTime, 
             LEAD([Message]) OVER (PARTITION BY EmployeeID ORDER BY DateTime ASC) nextMessage
             FROM  Log )

SELECT [EmployeeID], cast([DateTime] as date) as [Дата],
CONCAT(FORMAT(SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime))/60,'0#'),':',FORMAT(SUM(DATEDIFF(MINUTE, [DateTime], nextDateTime))%60,'0#')) as [Время нахождения]
FROM cte 
WHERE (nextMessage='Выход' OR nextMessage IS NULL) AND Message='Вход' AND DateTime >= '2019-08-01 00:0:00' AND DateTime <= '2019-08-31 23:59:00'

GROUP BY [EmployeeID], cast([DateTime] as date)
...
Рейтинг: 0 / 0
Объединение данных по дате и ID
    #39885100
Lekime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Remind,

Спасибо вам огромное!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединение данных по дате и ID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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