2016-03-28 2 views
-1

У меня есть эта таблица, которую я использовал для сохранения подробных сведений о регистрации пользователя. Я хочу запросить данные с начальным днем ​​недели и получать данные еженедельно, , например, если я запрошу с 1 марта 2016 года по 28 марта 2016 года, и мой день начала недели - среда, тогда мне нужны все данные о сотрудниках еженедельно марш 2-8 Март с 9 по 15 Марш от 16 до 22 для каждого сотрудника. Если на этой неделе кто-то работает более 40 часов, мне также нужно рассчитать дополнительный час.Sql get Employee Рабочий час в неделю в день начала недели (например, начало дня недели, понедельник, вторник и т. Д.)

CREATE TABLE #tempWeekdatbefore 
(EmployeeId BIGINT, LoginTime DATETIME, LogOutTime DATETIME) 


INSERT INTO #tempWeekdatbefore (EmployeeId,LoginTime,LogOutTime) 
Values 
(83  ,'2016-03-09 06:55:22.000', '2016-03-09 14:29:11.000'), 
(98  ,'2016-03-09 07:04:22.000', '2016-03-09 11:53:12.000'), 
(84  ,'2016-03-09 07:07:06.000', '2016-03-09 13:39:03.000'), 
(136 ,'2016-03-09 07:29:14.000', '2016-03-09 13:20:24.000'), 
(420 ,'2016-03-09 07:33:48.000', '2016-03-09 11:42:52.000'), 
(101102 ,'2016-03-09 07:49:25.000', '2016-03-09 11:42:53.000'), 
(425 ,'2016-03-09 07:49:45.000', '2016-03-09 12:47:46.000'), 
(100750 ,'2016-03-09 07:56:26.000', '2016-03-09 12:43:16.000'), 
(90  ,'2016-03-09 08:03:51.000', '2016-03-09 11:19:38.000'), 
(78  ,'2016-03-09 08:52:09.000', '2016-03-09 13:26:56.000'), 
(89  ,'2016-03-09 09:06:57.000', '2016-03-09 13:41:30.000'), 
(60600 ,'2016-03-09 09:31:17.000', '2016-03-09 17:13:48.000'), 
(219 ,'2016-03-09 11:50:51.000', '2016-03-09 15:07:42.000'), 
(90  ,'2016-03-09 11:54:38.000', '2016-03-09 16:47:30.000'), 
(420 ,'2016-03-09 12:12:33.000', '2016-03-09 14:53:59.000'), 
(101102 ,'2016-03-09 12:12:42.000', '2016-03-09 16:43:33.000'), 
(337 ,'2016-03-09 12:17:22.000', '2016-03-09 15:54:39.000'), 
(98  ,'2016-03-09 12:22:27.000', '2016-03-09 16:39:59.000'), 
(425 ,'2016-03-09 13:08:09.000', '2016-03-09 17:00:16.000'), 
(100750 ,'2016-03-09 13:09:32.000', '2016-03-09 15:00:00.000'), 
(136 ,'2016-03-09 13:32:12.000', '2016-03-09 16:00:00.000'), 
(84  ,'2016-03-09 13:50:37.000', '2016-03-09 16:23:04.000'), 
(89  ,'2016-03-09 14:11:00.000', '2016-03-09 15:00:00.000'), 
(101147 ,'2016-03-09 14:52:07.000', '2016-03-09 19:03:44.000'), 
(81  ,'2016-03-09 14:54:05.000', '2016-03-09 19:08:47.000'), 
(219 ,'2016-03-09 15:31:52.000', '2016-03-09 19:08:48.000'), 
(100701 ,'2016-03-09 16:00:18.000', '2016-03-09 19:05:08.000'), 
(337 ,'2016-03-09 16:27:44.000', '2016-03-09 19:08:50.000'), 
(90  ,'2016-03-09 16:54:34.000', '2016-03-09 17:38:00.000') 

SELECT EmployeeId 
,SUM(CASE WHEN ISNULL(RegTime, 0)>40 THEN RegTime-40 ELSE 0 END) AS ExtraHour 
,SUM(CASE WHEN ISNULL(RegTime, 0)>40 THEN 40 ELSE RegTime END) AS RegTime 
FROM(

Select EmployeeId, 
    DATEPART(dw,LoginTime) AS WeekNumber, 
    DATEPART(MONTH,LoginTime) AS MonthNumber, 
    DATEPART(Year,LoginTime) AS YearNumber, 
    SUM(CONVERT(decimal(18, 2), 
    DATEDIFF(MINUTE, LoginTime, isnull(LogOutTime,getdate()))/60.00)) AS RegTime 
FROM  #tempWeekdatbefore WITH(NOLOCK) 
WHERE  (convert(date, LoginTime) >= convert(date, '3/9/2016')) AND 
(convert(date,LogOutTime) <= convert(date, '3/9/2016')) 
GROUP BY EmployeeId, DATEPART(dw,LoginTime), 
DATEPART(MONTH,LoginTime), DATEPART(Year,LoginTime)) as e 
GROUP BY EmployeeId, WeekNumber, MonthNumber, YearNumber 
+0

В чем проблема, с которой вы столкнулись? – MusicLovingIndianGirl

+0

выпуск с группировкой данных еженедельно в день начала недели. – Gaurav

ответ

0

я сделал какую-то работу по определению в первый день и последний день предыдущей, текущей и на следующей неделю с переменным отправным днем ​​недели при создании BusinessObjects Вселенной (First day of previous week with a twist).

Очевидно, что часть BusinessObjects не применяется, но я до сих пор считаю, что основной SQL может все еще быть полезным ...

declare @StartDate datetime 
declare @StartDateDayOfWeek int 
declare @BeginningDayOfWeek int 

set @StartDate = '03/01/2016' 
set @StartDateDayOfWeek = DATEPART(dw, @StartDate) 

set @BeginningDayOfWeek = 4 --Wednesday 

select DATEADD(DAY, (-7 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 
, DATEADD(DAY, (-13 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 
, DATEADD(DAY, (-14 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 
, DATEADD(DAY, (-20 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 
, DATEADD(DAY, (-21 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 
, DATEADD(DAY, (-27 + ((@StartDateDayOfWeek - @BeginningDayOfWeek + 7) % 7)) * -1, @StartDate) 

Если скопировать этот SQL и запустить его, вы получите даты вы упомянули. Вам явно нужно будет адаптировать это к вашей ситуации, но, надеюсь, это поможет вам двигаться в правильном направлении.

Noel

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