2015-09-10 5 views
1

У меня есть таблица, которая ежедневно хранит In_time и Out_Time для каждого сотрудника. Я хочу рассчитать часы работы каждого сотрудника еженедельно или, может быть, в месяц? Как мне это сделать?Как группировать записи по дате в Tsql?

Структура таблицы:

   **Empid** : 1  ; 2  ; 3 
       **Pdate** : 7 aug 15 ; 8 aug 15 ; 9 aug 15 
       **P_In** : 8:48:21 ; 8:50:10 ; 8:37:00 
       **P_Out** : 15:07:21 ; 16:45:18 ; 16:47:10 

и так далее для полного года. EmpId - VARCHAR бновить, P_In, P-Out - DateTime

Теперь я хочу расчета общего времени работы каждого сотрудников в неделю, в месяц или между заданным диапазоном дат. Пожалуйста, помогите, как подать заявку «группа по» в таком сценарии.

Что я сделал: Существует отдельная колонка, в которой хранится разница между Pin и Pout; говорят, что это называется Workhrs. Так, Workhrs = Pout - Pin

ВЫБОР emp_name, emp_id, minutes_worked = СУММ (DATEDIFF (МИНУТНЫЙ, '0:00:00', WorkHRs)) из dailydata группы по Emp_Name, emp_id

The выше запрос даст мне данные об общей длительности работы каждого сотрудника. Однако я хочу работать в неделю и в месяц. Как мне это сделать?

+0

где запрос вы пробовали. Покажите несколько действий –

+0

Не храните дату и время в двух разных столбцах, вместо этого используйте один столбец времени. Будет намного проще. – jarlh

+3

Почему сотрудники уходят до их прибытия? – jarlh

ответ

0

за неделю:

select 
    Empid, 
    datepart(ww, Pdate) per_week, 
    sum(DATEDIFF(mi, P_In, P_Out))/60.0 total_time 
from employees 
--where Pdate betweek start_date and end_date 
group by Empid, datepart(ww, Pdate) 
order by Empid 

в месяц:

select 
    Empid, 
    datepart(mm, Pdate) per_month, 
    sum(DATEDIFF(mi, P_In, P_Out))/60.0 total_time 
from employees 
--where Pdate betweek start_date and end_date 
group by Empid, datepart(mm, Pdate) 
order by Empid 

Если вы хотите, чтобы данные между двумя датами раскомментировали предложение where и даты замены для start_date and end_date

Здесь предполагается, что его тип данных [P_In], [P_Out] время тип данных, если это varchar затем использовать cast; cast(P_In as date):

Демо: sqlfiddle

+0

Можем ли мы применить предложение where в приведенном выше запросе, например, для конкретного сотрудника? –

+0

Да ... 'где Empid = 1', если у вас alredy есть предложение where then' и Empid = 1' – Praveen

0

Попробуйте это. Не уверен, что .. Проверьте ваши данные и изменить, как вам нравится

CREATE TABLE #TEMP(ID INT PRIMARY KEY IDENTITY(1,1),EMPID INT, PDATE DATETIME,PIN DATETIME,POUT DATETIME) 

INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(1,'2015-09-10 00:00:00','2015-09-10 08:10:00','2015-09-10 16:10:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(2,'2015-09-10 00:00:00','2015-09-10 08:05:00','2015-09-10 16:25:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(3,'2015-09-10 00:00:00','2015-09-10 08:01:00','2015-09-10 16:03:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(1,'2015-09-11 00:00:00','2015-09-11 08:20:00','2015-09-11 16:10:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(2,'2015-09-11 00:00:00','2015-09-11 08:12:00','2015-09-11 16:14:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(3,'2015-09-11 00:00:00','2015-09-11 08:10:00','2015-09-11 16:10:00') 
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT)VALUES(1,'2015-09-12 00:00:00','2015-09-12 08:00:00','2015-09-12 16:00:00') 

SELECT EMPID,CAST(SUM(DATEDIFF(n,PIN,POUT))/60 AS VARCHAR)+':'+CAST(SUM(DATEDIFF(n,PIN,POUT))%60 AS VARCHAR) AS [HH:MM] FROM #TEMP WHERE PDATE BETWEEN '2015-09-10 00:00:00' AND '2015-09-12 00:00:00' GROUP BY EMPID 

DROP TABLE #TEMP 

Изменить Где Condition с диапазоном дат

Смежные вопросы