2017-12-01 2 views
1

Es gibt ein neues Gesetz, das in einer der Städte, in denen wir tätig sind, in Kraft tritt. Wir müssen mindestens 11 Stunden ab dem Zeitpunkt haben, an dem jemand ausschaltet, bis er einsteigen kann. Wenn die Zeit weniger als 11 Stunden beträgt, müssen wir ihnen für jeden Vorfall einen bestimmten Betrag zahlen.Stunden zwischen Schichten berechnen

Ich bin mit SQL Server 2012

Ich brauche Hilfe bei der Bestimmung, welche, wie viele Stunden pro Person zwischen den Schichten hat. Basierend auf den unten stehenden Aufzeichnungen, würden wir für 11/14 11:28 Uhr -> 11/15 8:56 Uhr (9.28 Uhr) und 11/29 2:32 Uhr -> 11/29 10:11 Uhr (7,39 Stunden)

schulden
CREATE TABLE #Shift(
    FKEmployeeNumber int, 
    DateOfBusiness datetime, 
    FKStoreId int, 
    EmployeeShiftNumber int, 
    FKJobCodeId int, 
    InHour int, 
    InMinute int, 
    OutHour int, 
    OutMinute int) 

insert into #Shift (FKEmployeeNumber, DateOfBusiness, FKStoreId, EmployeeShiftNumber, FKJobCodeId, InHour, InMinute,OutHour,OutMinute) 
values 
(529251, '11/13/2017', 3013, 0, 1, 8, 1, 16, 24), 
(529251, '11/14/2017', 3013, 0, 1, 15, 21, 23, 28), 
(529251, '11/15/2017', 3013, 0, 1, 8, 56, 15, 58), 
(529251, '11/16/2017', 3013, 0, 1, 14, 59, 20, 54), 
(529251, '11/19/2017', 3013, 0, 1, 12, 40, 19, 42), 
(529251, '11/20/2017', 3013, 1, 1, 8, 28, 23, 47), 
(529251, '11/21/2017', 3013, 0, 1, 15, 31, 23, 30), 
(529251, '11/25/2017', 3013, 0, 1, 10, 26, 18, 13), 
(529251, '11/27/2017', 3013, 0, 1, 9, 58, 18, 27), 
(529251, '11/28/2017', 3013, 0, 1, 14, 59, 2, 32), 
(529251, '11/29/2017', 3013, 0, 1, 10, 11, 17, 13), 
(529251, '11/29/2017', 3013, 1, 1, 17, 16, 17, 25), 
(529251, '11/30/2017', 3013, 0, 1, 15,4, 20, 0), 
(529251, '11/30/2017', 3013, 1, 1, 20, 0, 23, 18), 
(529251, '11/30/2017', 3013, 2, 1, 23, 18, 23, 22), 
(529251, '12/01/2017', 3013, 0, 1, 12, 12, 16, 0) 


Select 
sh.dateofbusiness,sh.fkstoreid,sh.employeeshiftnumber,sh.fkemployeenumber, sh.fkjobcodeid,sh.inHour,sh.InMinute,sh.OutHour,sh.OutMinute 
from #shift sh where sh.dateofbusiness > '11/12/2017' and sh.fkemployeenumber = 529251 
order by sh.FKEmployeeNumber, sh.DateOfBusiness 
+0

Sie haben fälschlicherweise Zeit als separate Integer-Felder für jeden timepart gespeichert. Das wird kein Spaß sein. Ich würde vorschlagen, um zu beginnen, dass Sie jene Sachen zurück in einen korrekten timestamp Datentyp umwandeln, also können Sie gerade einen Satz vom folgenden abziehen, 'LAG (yourtimestamp) OVER (PARTITION DURCH FKEmployeeNumber ORDER BY DateOfBusiness DESC)' zu verwenden, um das vorherige zu erhalten Zeit-Eintrag Details für Ihre aktuelle Aufzeichnung, sonst werden Sie in eine Welt der Verletzung. – JNevill

+0

Wir erhalten die Daten von unserem POS-Anbieter zu uns repliziert. Die Stunden und Minuten sind in getrennten Spalten, also habe ich keine Kontrolle darüber. – user3446684

+0

Ist POS für Stück Sh ** kurz? ;) Ich denke jedoch, dass die wirkliche Frage hier ist, wie man die In und Out Zeit richtig in einen richtigen Zeitstempel umwandelt, dann kannst du LAG() benutzen, um deine vorherige Zeit zu erhalten und subtrahieren . Konvertiere, subtrahiere mit Lag() und du bist golden. – JNevill

Antwort

0

Hier ist ein Weg nach dem Erstellen einiger Datum Zeiten ... mit einem Cte und Self Join.

if object_id('tempdb..#Shift') is not null 
drop table #Shift 

CREATE TABLE #Shift(
    FKEmployeeNumber int, 
    DateOfBusiness datetime, 
    FKStoreId int, 
    EmployeeShiftNumber int, 
    FKJobCodeId int, 
    InHour int, 
    InMinute int, 
    OutHour int, 
    OutMinute int) 

insert into #Shift (FKEmployeeNumber, DateOfBusiness, FKStoreId, EmployeeShiftNumber, FKJobCodeId, InHour, InMinute,OutHour,OutMinute) 
values 
(529251, '11/13/2017', 3013, 0, 1, 8, 1, 16, 24), 
(529251, '11/14/2017', 3013, 0, 1, 15, 21, 23, 28), 
(529251, '11/15/2017', 3013, 0, 1, 8, 56, 15, 58), 
(529251, '11/16/2017', 3013, 0, 1, 14, 59, 20, 54), 
(529251, '11/19/2017', 3013, 0, 1, 12, 40, 19, 42), 
(529251, '11/20/2017', 3013, 1, 1, 8, 28, 23, 47), 
(529251, '11/21/2017', 3013, 0, 1, 15, 31, 23, 30), 
(529251, '11/25/2017', 3013, 0, 1, 10, 26, 18, 13), 
(529251, '11/27/2017', 3013, 0, 1, 9, 58, 18, 27), 
(529251, '11/28/2017', 3013, 0, 1, 14, 59, 2, 32), 
(529251, '11/29/2017', 3013, 0, 1, 10, 11, 17, 13), 
(529251, '11/29/2017', 3013, 1, 1, 17, 16, 17, 25), 
(529251, '11/30/2017', 3013, 0, 1, 15,4, 20, 0), 
(529251, '11/30/2017', 3013, 1, 1, 20, 0, 23, 18), 
(529251, '11/30/2017', 3013, 2, 1, 23, 18, 23, 22), 
(529251, '12/01/2017', 3013, 0, 1, 12, 12, 16, 0) 


;with cte as(
select 
    FKEmployeeNumber 
    ,DateOfBusiness 
    ,FKStoreId 
    ,EmployeeShiftNumber 
    ,FKJobCodeId 
    ,clockin = cast(convert(varchar(10),DateOfBusiness,101) + ' ' + right('00' + cast(InHour as varchar),2) + ':' + right('00' + cast(InMinute as varchar),2) as datetime) 
    ,clockout = cast(convert(varchar(10),DateOfBusiness,101) + ' ' + right('00' + cast(OutHour as varchar),2) + ':' + right('00' + cast(OutMinute as varchar),2) as datetime) 
from 
    #Shift), 

cte2 as(
select *, RN = row_number() over (partition by FKEmployeeNumber order by clockin) 
from cte) 

select 
    c.FKEmployeeNumber 
    ,c.DateOfBusiness 
    ,c.FKStoreId 
    ,c.EmployeeShiftNumber 
    ,c.FKJobCodeId 
    ,c.clockin 
    ,c.clockout 
    ,nexClockInHourDifference = datediff(minute,c.clockout,c2.clockin)/60.0 
from cte2 c 
left join cte2 c2 on c2.FKEmployeeNumber = c.FKEmployeeNumber and c2.RN = c.RN + 1 

drop table #Shift 

Auch da Sie auf 2012 sind, Sie LEAD hier verwenden können, und entfernen Sie die row_number() Funktion ....

;with cte as(
select 
    FKEmployeeNumber 
    ,DateOfBusiness 
    ,FKStoreId 
    ,EmployeeShiftNumber 
    ,FKJobCodeId 
    ,clockin = cast(convert(varchar(10),DateOfBusiness,101) + ' ' + right('00' + cast(InHour as varchar),2) + ':' + right('00' + cast(InMinute as varchar),2) as datetime) 
    ,clockout = cast(convert(varchar(10),DateOfBusiness,101) + ' ' + right('00' + cast(OutHour as varchar),2) + ':' + right('00' + cast(OutMinute as varchar),2) as datetime) 
from 
    #Shift) 


select 
    c.FKEmployeeNumber 
    ,c.DateOfBusiness 
    ,c.FKStoreId 
    ,c.EmployeeShiftNumber 
    ,c.FKJobCodeId 
    ,c.clockin 
    ,c.clockout 
    ,nexClockInHourDifference = datediff(minute,c.clockout,lead(c.clockin) over(partition by FKEmployeeNumber order by clockin))/60.0 
from cte c 

drop table #Shift 
Verwandte Themen