2009-07-15 2 views
2

Ich habe zwei Datetime-Felder, die ich zusammen hinzufügen möchte. Sie haben folgendes Format: '01/01/1900 00:00:00 '.T-Sql 2005 Hinzufügen von Stunden zu einem Datetime-Feld mit dem Ergebnis innerhalb der Arbeitszeit

Das Hauptproblem mit diesem ist, dass ich die Berechnung nur Arbeitsstunden einschließen möchte. Der Arbeitstag ist zwischen 08:30 und 17:30 und schließt Wochenenden nicht mit ein:

Auch wenn das erste Feld außerhalb des Arbeitstages beginnt oder an einem Wochenende ist, sollte das zweite Feld von Anfang an hinzugefügt werden der nächste Arbeitstag.

Zum Beispiel:

`'26/06/2009 15.45.00' + '01/01/1900 9.00.00' = '29/06/1900 15.45.00'

'12/07/2009 14.22.36' + '01/01/1900 18.00.00' = '13/07/1900 8.30.00'

'15/07/2009 08:50:00 '+ '01/01/1900 04:00:00' = '15/07/2009 12: 50: 00'`

Ich bin mir ziemlich sicher, dass dies mit der Erstellung eines benutzerdefinierte Funktion, um dies auszuarbeiten, aber ich habe keine Ahnung, wie man das überhaupt beginnt (ich bin ziemlich außerhalb meiner Tiefe h Kann mir jemand Ratschläge geben, wie ich das erreichen kann?

+0

hilft Ich glaube nicht, Ihre Frage viel Sinn macht. Was versuchst du eigentlich zu erreichen? –

+0

Ich möchte ein Datum + Zeit in der Zukunft berechnen, indem ich eine bestimmte Anzahl von Arbeitsstunden zu einem anderen Datum hinzufüge (das kann innerhalb der Arbeitsstunden sein). Ich bin mir nicht sicher Wie ich es noch viel deutlicher machen kann, wenn ich ehrlich bin. –

+0

Ich denke, was Sie wirklich tring ist, fügen Sie einfach den Zeitabschnitt vom zweiten Datetime-Wert bis zum ersten Datetime-Wert hinzu. Wenn dies korrekt ist, müssen Sie Ihr zweites Beispiel korrigieren. Sollte es nicht '12/07/2009 14:22:36 '+ '01/01/1900 18:00:00' = '14/07/1900 14:22:00 'sein, da Sie 18' hinzufügen Arbeitszeit? –

Antwort

4

dies versuchen, könnten Sie es in einer Funktion

DECLARE @Date DATETIME, 
     @StartOfDay FLOAT, 
     @EndOfDay FLOAT, 
     @DateAdd DATETIME 

SELECT @Date ='2009-06-26 15:45:00.000', 
     @StartOfDay = 8.5, 
     @EndOfDay = 17.5, 
     @DateAdd = '1900-01-01 09:00:00.000' 

--fix up start date 
--before start of day, move to start of day 
IF ((CAST(@Date - DATEADD(dd,0, DATEDIFF(dd,0,@Date)) AS FLOAT) * 24) < @StartOfDay) 
BEGIN 
    SET @Date = DATEADD(mi, @StartOfDay * 60, DATEDIFF(dd,0,@Date)) 
END 

--after close of day, move to start of next day 
IF ((CAST(@Date - DATEADD(dd,0, DATEDIFF(dd,0,@Date)) AS FLOAT) * 24) > @EndOfDay) 
BEGIN 
    SET @Date = DATEADD(mi, @StartOfDay * 60, DATEDIFF(dd,0,@Date)) + 1 
END 

--move to monday if on weekend 
WHILE DATENAME(dw, @Date) IN ('Saturday','Sunday') 
BEGIN 
    SET @Date = @Date + 1 
END 

--get the number of hours to add and the total hours per day 
DECLARE @HoursPerDay FLOAT 
DECLARE @HoursAdd FLOAT 
SET @HoursAdd = DATEDIFF(hh, '1900-01-01 00:00:00.000', @DateAdd) 
SET @HoursPerDay = @EndOfDay - @StartOfDay 

--date the time of geiven day 
DECLARE @CurrentHours FLOAT 
SET @CurrentHours = CAST(@Date - DATEADD(dd,0, DATEDIFF(dd,0,@Date)) AS FLOAT) * 24 

--if we stay in the same day, all is fine 
IF (@CurrentHours + @HoursAdd <= @EndOfDay) 
BEGIN 
    SET @Date = @Date + @DateAdd 
END 
ELSE 
BEGIN 
    --remove part of day 
    SET @HoursAdd = @HoursAdd - (@EndOfDay - @CurrentHours) 
    --,ove to next day 
    SET @Date = DATEADD(dd,0, DATEDIFF(dd,0,@Date)) + 1 

    --loop day 
    WHILE @HoursAdd > 0 
    BEGIN 
     --add day but keep hours to add same 
     IF (DATENAME(dw,@Date) IN ('Saturday','Sunday')) 
     BEGIN 
      SET @Date = @Date + 1 
     END 
     ELSE 
     BEGIN 
      --add a day, and reduce hours to add 
      IF (@HoursAdd > @HoursPerDay) 
      BEGIN 
       SET @Date = @Date + 1 
       SET @HoursAdd = @HoursAdd - @HoursPerDay 
      END 
      ELSE 
      BEGIN 
       --add the remainder of the day 
       SET @Date = DATEADD(mi, (@HoursAdd + @StartOfDay) * 60, DATEDIFF(dd,0,@Date)) 
       SET @HoursAdd = 0 
      END 
     END  
    END 
END 

SELECT @Date 

Hoffnung, die

setzen müssen
+0

funktioniert gut .. du bist großartig :) – watraplion

1

Sie könnten die Dayofweek-Funktion und einige Inline-Case-Anweisungen verwenden;

http://www.smallsql.de/doc/sql-functions/date-time/dayofweek.html

http://www.tizag.com/sqlTutorial/sqlcase.php

so, dann würden Sie die Berechnung durchführen, wenn die dayofweek Funktion sat nicht zurückkehrte. oder Sonne; sonst gib eine Null zurück.

Ich denke, Sie könnten wegkommen, ohne eine benutzerdefinierte Funktion zu schreiben, aber die SQL-Anweisung würde ein bisschen chaotisch aussehen. Aber dann wieder die meisten nicht-grundlegende SQL-Anweisungen sehen alle ein bisschen chaotisch aus!

Verwandte Themen