2009-10-06 8 views
0

ExempleMauvais rendement total?

Je veux calculer le temps de travail entre 09:00:00 à 18:00:00,

09:00:00 - Normal_Intime 
18:00:00 - Normal_Outtime 

On suppose

1) Intime is 10:00:00, Outtime is 17:00:00 It should give the output as 07:00:00 
2) Intime is 08:00:00. Outtime is 19:00:00 It should give the output as 09:00:00 

ci-dessus sortie devrait comparer avec Normal_Intime, Normal_Outtime. Les moyennes Normal_Intime est 09:00:00 seulement et Normal_Output est 18:00:00 seulement, donc Intime ne devrait pas> 09:00:00 et Outtime < 18:00:00.

Recherche

select Intime, Outtime, CONVERT(char(8), CASE WHEN OutTime > Normal_Outtime THEN cast(Normal_Outtime AS datetime) ELSE cast(OutTime AS datetime) END - CASE WHEN InTime > Normal_Intime THEN cast(InTime AS datetime) ELSE cast(Normal_Intime AS datetime) END, 8) AS WorkTime from table 

Sortie

Intime  Outtime  Worktime 
15:37:48 22:08:15 02:22:12 
07:33:34 07:59:13 22:59:13 

la deuxième rangée donnant la mauvaise sortie Il devrait donner seulement 00:25:39

Si les deux dans et hors du temps est plus petit que NormalInTime et Le délai d'entrée et de sortie est supérieur à NormalOutTime. Comment faire une condition pour cela

Comment faire une recherche pour cette condition.

Besoin d'aide pour la requête.

+2

Comment allez-vous à "09:00:00" dans votre deuxième exemple? Quel est exactement le nombre que vous essayez d'obtenir censé exprimer? – Bombe

+0

Votre exemple n'a pas de sens. Dans la deuxième rangée, les deux entrées et sorties sont plus petites que NormalInTime ... –

+0

@astander. Que ce que j'ai demandé une condition à la fois pour l'entrée et la sortie est plus petit que NormalInTime et à la fois in et out est supérieur à NormalOutTime. Comment faire une condition pour cela. – Gopal

Répondre

2

Cela devrait vous obtenez ce que vous voulez

DECLARE @Table TABLE(
     InTime DATETIME, 
     OutTime DATETIME 
) 

INSERT INTO @Table (InTime,OutTime) SELECT '15:37:48', '22:08:15' 
INSERT INTO @Table (InTime,OutTime) SELECT '07:33:34', '07:59:13' 

DECLARE @Normal_InTime DATETIME, 
     @Normal_OutTime DATETIME 

SELECT @Normal_InTime = '09:00:00', 
     @Normal_OutTime = '18:00:00' 

SELECT *, 
     --both dates are smaller than NotmalInTime 
     CASE 
      WHEN InTime < @Normal_InTime AND OutTime < @Normal_InTime THEN OutTime - InTime 
      WHEN OutTime > @Normal_OutTime AND InTime > @Normal_OutTime THEN OutTime - InTime 
      WHEN OutTime > @Normal_OutTime 
       THEN @Normal_OutTime - InTime 
      WHEN InTime < @Normal_InTime 
       THEN OutTime - @Normal_InTime 
      ELSE OutTime - InTime 
     END 
FROM @Table 

Mais vous devez prendre en compte. Qu'est-ce qui se passe lorsque l'utilisateur livre avant 24h00, puis les livres le lendemain. Et comme je l'ai dit, que se passe-t-il dans le cas où book in et bookout est soit avant NormalTimeIn ou après NormalTimeOut?

vous devez le spécifier.

+0

Fonctionne pour moi - gère également le scénario où InTime et OutTime sont supérieurs à Normal_OutTime – DilbertDave

0

Avez-vous essayé celui-ci:

SELECT CONVERT(varchar, Outtime - Intime, 108) FROM YourTable 

Outtime - Intime vous donnera un laps de temps que vous voulez et convertir avec le paramètre 108 vous donnera quelques heures, minutes et secondes de cette timespan more info about convert

+0

@RaYell. Je n'ai pas demandé la conversion, j'ai demandé seulement la condition du cas. S'il vous plaît lire ma question. – Gopal

1

VOUS DEVRIEZ CONSIDÉRER LA DATE AUSSI TOUT EN CALCULANT L'HEURE.

declare 
@Normal_Intime datetime, 
@Normal_Outtime datetime, 
@Actual_Intime datetime, 
@Actual_Outtime datetime 
set @Normal_Intime = cast('09:00:00' as datetime) 
set @Normal_Outtime =cast('18:00:00' as datetime) 

-- CASE 1 
set @Actual_Outtime = cast('17:00:00' as datetime) 
set @Actual_Intime = cast('10:00:00' as datetime) 

select case when @Actual_Intime > @Normal_Intime then @Actual_Intime else @Normal_Intime end - 
case when @Actual_Outtime < @Normal_Outtime then @Actual_Outtime else @Normal_Outtime end 

-- CASE 2  

set @Actual_Outtime = cast('19:00:00' as datetime)  
set @Actual_Intime = cast('08:00:00' as datetime)  

select case when @Actual_Intime > @Normal_Intime then @Actual_Intime else @Normal_Intime end - 
case when @Actual_Outtime < @Normal_Outtime then @Actual_Outtime else @Normal_Outtime end 

-- CASE 3 

set @Actual_Outtime = cast('07:59:13' as datetime)  
set @Actual_Intime = cast('07:33:34' as datetime)  

select case when @Actual_Intime > @Normal_Intime then @Actual_Intime else @Normal_Intime end - 
case when @Actual_Outtime < @Normal_Outtime then @Actual_Outtime else @Normal_Outtime end 
+0

Pas très utile, même après la modification. –

+0

Je ne peux pas placer mon code dans la section de réponse ?? – solairaja

+0

Vérifiez les directives de balisage: http://stackoverflow.com/editing-help – DilbertDave