2017-03-18 2 views

Répondre

1

Étant donné que le type de données est Time, Sql server ne peut pas savoir vous dire l'heure de début et de fin est un autre jour.
Voici une façon de résoudre ce:

SELECT CASE WHEN Start_Time > Finish_Time THEN 
      DATEDIFF(minute, CAST(Start_Time As datetime), DATEADD(DAY, 1, CAST(Finish_Time As datetime))) 
     ELSE 
      DATEDIFF(minute, Start_Time, Finish_Time) 
     END 
FROM @T 

Si vous voulez que le résultat de retour comme time, vous pouvez le faire à la place:

SELECT CASE WHEN Start_Time > Finish_Time THEN 
      CAST(DATEADD(DAY, 1, CAST(Finish_Time As datetime)) - CAST(Start_Time As datetime) as time) 
     ELSE 
      CAST(CAST(Finish_Time As datetime) - CAST(Start_Time As datetime) as time) 
     END 
FROM @T 

See live demo on rextester

Voici une façon d'obtenir les valeurs décimales, où le côté droit de la virgule décimale est les heures et le côté gauche les minutes:

SELECT CAST(
      REPLACE(
        CONVERT (char(5), 
           CASE WHEN Start_Time > Finish_Time THEN 
           CAST(DATEADD(DAY, 1, CAST(Finish_Time As datetime)) - CAST(Start_Time As datetime) as time) 
           ELSE 
           CAST(CAST(Finish_Time As datetime) - CAST(Start_Time As datetime) as time) 
           END 
        , 114) 
      , ':', '.') 
     as decimal(4,2)) 
FROM @T 

Dernière édition:

;WITH CTE AS 
(
    SELECT CASE WHEN Start_Time > Finish_Time THEN 
       DATEDIFF(minute, CAST(Start_Time As datetime), DATEADD(DAY, 1, CAST(Finish_Time As datetime))) 
      ELSE 
       DATEDIFF(minute, Start_Time, Finish_Time) 
      END As DiffInMinutes 
    FROM @T 
) 
SELECT ((DiffInMinutes - (DiffInMinutes % 60))/60) + CAST((DiffInMinutes % 60) as float)/60 As DiffAsDecimalHours 
FROM CTE 
+0

Merci pour votre aide Johar. J'utilise la première façon de résoudre mon problème. Mais il montre des valeurs comme entier. J'essaie de convertir cette colonne en float avec deux décimales mais en donnant une erreur. Pourriez-vous s'il vous plaît me conseiller comment convertir ceci en float avec deux décimales. Merci beaucoup! –

+0

Donc vous voulez que le résultat soit '00.45'? Vous réalisez que ce n'est pas la même chose que 00: 45, n'est-ce pas? –

+0

@DineshGuleria - stocker "temps décimal" revient presque toujours à mordre les gens - généralement après qu'ils ont déjà fait quelque chose d'inapproprié (comme l'ajout de deux de ces valeurs ensemble) et s'attendre à quelque façon magiquement résoudre ce problème. –