2013-02-14 5 views
1

J'ai besoin d'aide pour convertir la logique excel suivante en sous-requête SQL. Votre aide est très appréciée.Calcul des minutes entre les dates

Colonne C

  • Row 2) 01/10/12 16:24
  • Row 3) 01/10/12 16:25
  • Row 4) 01/10/12 16:26
  • Ligne 5) 01/10/12 19:27

Minutes cumulées

  • Row 2) 2
  • Row 3) 1
  • Row 4) 1
  • Row 5) 45

Excel Formule

  • Row 2) = IF ((C3- C2)> 45,45, (C3-C2) * 1440)
  • Ligne 3) = IF ((C4-C3)> 45,45, (C4-C3) * 1440)
  • Ligne 4) = IF ((C5-C4)> 45,45, (C5-C4) * 1440)
  • ligne 5) = IF ((C6-C5)> 45,45, (C6-C5) * 1440)
+0

Qu'avez-vous essayé? Qu'est-ce qui est dans la rangée 1? Qu'est-ce que les formules Excel ont à voir avec votre problème? – HABO

+0

Voulez-vous savoir à propos de DateDiff ou comment faire des requêtes totales en cours d'exécution ou les deux? –

Répondre

1

Que diriez-vous ceci:

WITH CTE(RowNumber, Date) AS(
select 1, '2012-01-10 16:22' union 
select 2, '2012-01-10 16:24' union 
select 3, '2012-01-10 16:25' union 
select 4, '2012-01-10 16:26' union 
select 5, '2012-01-10 19:27' 
) 
select b.Date, IIF(DATEDIFF(minute, a.Date, b.Date) > 45, 45, DATEDIFF(minute, a.Date, b.Date)) as AccumulatedMinutes 
from CTE b left outer join CTE a on a.RowNumber = b.RowNumber - 1 

Il retourne:

2012-01-10 16:22 NULL 
2012-01-10 16:24 2 
2012-01-10 16:25 1 
2012-01-10 16:26 1 
2012-01-10 19:27 45 
+0

Merci, Chrisb. Comment empêchez-vous l'expression de calculer des valeurs NULL? J'ai essayé ce qui suit, mais j'ai échoué. Des idées? SOMME (CAS LORS DE DATEDIFF (minute, ISNULL (b.Date, a.Date), ISNULL (b.Date, un.Date))> 45 \t \t ALORS 45 ELSE DATEDIFF (minute, ISNULL (a.Date, b .Date), ISNULL (b.Date, a.Date)) END) comme 'AccumulatedMinutes' – N00b

+0

Envelopper le IIF() avec ISNULL vous donnera 0 à la place - ISNULL (IIF (...), 0) – chrisb