2016-03-28 5 views
-1

Ich habe diese Tabelle, die ich verwendet, um Benutzeranmeldung Logout Details zu speichern. Ich möchte Daten mit Start Wochentag abfragen, und Daten wöchentlich abholen, zB wenn ich vom 1. März 2016 bis 28. März 2016 abfrage und mein Starttag der Woche ist Mittwoch, dann brauche ich alle Mitarbeiterdaten wöchentlich März 2 bis 8 März 9 bis 15 März 16 bis 22 für jeden Mitarbeiter. Wenn jemand in dieser Woche mehr als 40 Stunden arbeitet, muss ich auch eine zusätzliche Stunde berechnen.Sql erhalten Mitarbeiter Arbeitsstunde wöchentlich zum Anfang Wochentag (z. B. Starttag der Woche, Montag, Dienstag, etc.)

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

Was ist das Problem, vor dem Sie stehen? – MusicLovingIndianGirl

+0

Problem mit dem Gruppieren von Daten wöchentlich zum Anfangstag der Woche. – Gaurav

Antwort

0

Ich habe einige Arbeit auf den ersten Tag der Bestimmung und letzten Tagen der vorherigen, aktuellen und der nächsten Woche mit einem variablen Starttag der Woche, wenn ein Business Universum (First day of previous week with a twist) zu bauen.

Offensichtlich hat der Business Teil nicht anwenden, aber ich denke immer noch die zugrunde liegende SQL noch nützlich sein kann ...

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) 

Wenn das SQL kopieren und laufen Sie die Termine bekommen Sie erwähnt. Sie müssen dies eindeutig auf Ihre Situation abstimmen, aber hoffentlich bringt Sie das in die richtige Richtung.

Noel

Verwandte Themen