2009-07-15 7 views
2

J'ai deux champs Datetime que je souhaite ajouter ensemble. Ils sont dans le format suivant: '01/01/1900 00:00:00 '.T-SQL 2005 Ajout d'heures à un champ datetime avec le résultat dans les heures de travail

Le problème principal avec ceci est que je veux que le calcul inclue seulement les heures de travail. La journée de travail est entre 08h30 et 17h30 et n'inclut pas les week-ends:

De même si le premier champ commence hors de la journée de travail ou est un week-end, le deuxième champ doit être ajouté depuis le début de le jour ouvrable suivant.

Par exemple:

`'26/06/2009 15:45:00' + '01/01/1900 09:00:00' = '29/06/1900 15:45:00'

'12/07/2009 14:22:36' + '01/01/1900 18:00:00' = '13/07/1900 08:30:00'

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

Je suis assez sûr que cela va impliquer la création d'un fonction définie par l'utilisateur pour travailler cela, mais je ne sais pas comment même commencer cela (je suis tout à fait hors de ma profondeur h ere) Quelqu'un pourrait-il me donner quelques conseils sur la façon d'y parvenir?

+0

Je ne pense pas que votre question fait beaucoup de sens. Qu'est-ce que vous essayez réellement d'accomplir? –

+0

Je veux calculer une date + heure dans le futur en ajoutant un certain nombre d'heures de travail à une autre date (qui mai mai ou ne pas être dans les heures de travail) .Im pas sûr Comment je peux clarifier beaucoup plus loin si je suis honnête. –

+0

Je pense que ce que vous êtes vraiment tring est ajouter juste la partie de temps de la deuxième valeur datetime à la première valeur datetime. Si cela est correct, vous devez corriger votre deuxième exemple. Ne devrait-il pas être '12/07/2009 14:22:36 '+ '01/01/1900 18:00:00' = '14/07/1900 14:22:00 ', puisque vous ajoutez 18' Heures de travail? –

Répondre

4

essayer cela, vous pourriez avoir à le mettre dans une fonction

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 

espoir qui aide

+0

fonctionne bien .. vous êtes super :) – watraplion

1

vous pourriez utiliser la fonction dayofweek et quelques instructions de cas en ligne;

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

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

donc, vous devriez effectuer le calcul si la fonction dayofweek n'a pas retourné SAM. ou le soleil .; sinon renvoie un null.

Je pense que vous pourriez vous en sortir sans écrire une fonction définie par l'utilisateur, mais l'instruction sql serait un peu brouillon. mais là encore, la plupart des instructions sql non-basiques ont toutes l'air un peu brouillon!

Questions connexes