2017-11-29 1 views
-5

Ich möchte eine Funktion in SQL Server 2008 R2 erstellen, die Non-OverTime Stunden (Non-OT) zurückgibt, wenn 2 Parameter @ShiftStart und @ShiftEnd bestanden. Die Überstunden sind zwischen 22:00 Uhr und 06:00 Uhr festgelegt. Wir wollen Nicht-OT-Stunden, die nicht in diesen OT-Stunden liegen. Wenige Fälle und das unten gezeigte Ergebnis.Funktion zum Berechnen von Stunden in SQL-Server 2008 R2

Case No   ShiftStart    ShiftEnd     Non-OT Hours 
1.  '2017-12-28 05:00:00.000' '2017-12-28 08:00:00.000'  2 calculated like this (06:00 - 08:00) 
2.  '2017-12-28 20:00:00.000' '2017-12-28 23:00:00.000'  2 calculated like this (22:00 - 20:00) 
3.  '2017-12-28 22:00:00.000' '2017-12-29 01:00:00.000'  0 as this shift is inside the OT hours 
4.  '2017-12-28 20:00:00.000' '2017-12-29 02:00:00.000'  2 calculated like this (22:00 - 20:00) 

Bitte helfen, die Funktion fn_GetNonOTHours schriftlich (@ ShiftStart, @ ShiftEnd)

Dank

+2

Bitte zeigen, was Sie haben versucht, alle Probleme, die Sie stellen. https://stackoverflow.com/help/how-to-ask –

+2

SO ist kein kostenloser Codierungsdienst. Sie müssen zeigen, was Sie bisher erreicht haben und wo Sie stecken bleiben. – Sunil

Antwort

0

CREATE FUNCTION fn_GetNonOTHours ( @ShiftStart Datumzeit , @ShiftEnd Datumzeit ) int AS BEGIN - Hier die Rückgabevariable deklarieren DECLARE @cnt int

Deklarieren @CurrentStart DATETIME @CurrentEnd Datumzeit

Wählen @ AktuellerStart = DATEADD (Stunde, 6, DATEADD (Tag, DATEDIFF (DAY, 0, @ShiftStart), 0)), @CurrentEnd = DATEADD (Stunde, -2, DATEADD (Tag, DATEDIFF (DAY, 0, @ShiftStart) +1, 0))

; mit CTE als ( Select Fall, wenn @ShiftStart < @CurrentStart dann @CurrentStart anderes @ ShiftStart Ende als StartHours, Fall wenn @ShiftEnd> @CurrentEnd dann @CurrentEnd else @ShiftEnd endet als EndHours)

Select @ cnt = DATEDIFF (Stunde, StartHours, EndHours) von CTE

RETURN @cnt

END

Tabelle #test (CaseNo int, ShiftStart Datumzeit, ShiftEnd datetime) Insert into # erstellen Testwerte (1, '2017-12-28 05: 00: 00.000', '2017-12-28 08: 00: 00.000') , (2, '2017-12-28 20: 00: 00.000', '2017-12-28 23: 00: 00.000')
, (3, '2017-12-28 22: 00: 00.000', '2017-12-29 01: 00: 00.000')
, (4 , 2017-12-28 20: 00: 00.000 ',' 2017-12-29 02 : 00: 00.000')

Select *, dbo.fn_GetNonOTHours (ShiftStart, ShiftEnd) Non_OT_Hour von #test